Limitations
While psd2svg strives to accurately convert PSD files to SVG format, there are inherent limitations due to differences between the Photoshop format and SVG capabilities.
Platform Support
Operating System Limitations
All Platforms: psd2svg works on Linux, macOS, and Windows with cross-platform text layer conversion support.
Text Layer Conversion:
Linux/macOS: Full support with fontconfig for font resolution and file path discovery
Windows: Full support with Windows registry for font resolution and file path discovery
Font Resolution Strategy:
psd2svg uses a hybrid font resolution approach:
Static mapping: ~4,950 fonts mapped by PostScript name
539 default fonts: Core fonts (Arial, Times New Roman, Noto fonts, Roboto, Adobe fonts, etc.)
370 Hiragino variants: Japanese fonts with W0-W9 weight pattern (generated dynamically)
4,042 Morisawa fonts: Professional Japanese typography fonts
Provides font family, style, and weight information
Works on all platforms without external dependencies
Enables text conversion to SVG
<text>elementsJSON-based lazy loading for optimal performance
Platform-specific font resolution (Linux/macOS/Windows):
Queries system fonts when file paths needed
Linux/macOS: fontconfig with CharSet API
Windows: Windows registry + fontTools cmap parsing
Used automatically by
FontInfo.find_with_files()method during conversionEnables font embedding with
embed_fonts=True
Font Embedding:
Font embedding is fully supported on all platforms:
Static mapping: Provides font metadata (family, style, weight) for text conversion
Font file discovery: Uses platform-specific resolution to locate font files
Linux/macOS: fontconfig with CharSet API (fontconfig-py >= 0.4.0)
Windows: Windows registry + fontTools cmap parsing
Text conversion: Works without font files (uses SVG
<text>with font-family names)Font embedding: Automatically locates font files when
embed_fonts=True
Custom Font Mapping:
For fonts not in the default mapping (~4,950 fonts), provide custom mappings:
import json
from psd2svg import SVGDocument
from psd_tools import PSDImage
# Load custom font mapping
with open("fonts.json") as f:
custom_fonts = json.load(f)
# Use in conversion
psdimage = PSDImage.open("input.psd")
document = SVGDocument.from_psd(psdimage, font_mapping=custom_fonts)
See the Font Handling guide for generating custom mappings.
SVG 1.1 Limitations
Blending Modes
SVG 1.1 does not support all Photoshop blending modes. Some blending modes have no SVG equivalent:
Unsupported blending modes:
Dissolve
Darker Color
Lighter Color
Linear Dodge
Linear Burn
Vivid Light
Linear Light
Pin Light
Hard Mix
Subtract
Divide
Linear Dodge is converted to plus-darker and Linear Burn to plus-lighter.
However, majority of SVG renderers do not support these modes.
Partially supported:
Some blending modes may render differently across browsers or may use approximations.
Workaround: Consider flattening layers with unsupported blending modes in Photoshop before conversion.
Gradient
SVG does not support all the gradient types available in Photoshop:
Angle
Reflected
Diamond
Also, gradient interpolation methods may differ. Classic interpolation is closest to SVG’s linear interpolation, but others may not match exactly:
Perceptual
Linear
Classic
Smooth
Stripes
Workaround: Use linear or radial gradients in Photoshop for best compatibility.
Filter Effects
The following filter effects are not supported:
Bevels and embossing
Satin
Other filter effects are approximations and may not exactly match Photoshop’s rendering:
Drop shadows and inner shadows
Inner and outer glows
Stroke
Color, gradient, and pattern overlays
The converter does its best to approximate these effects, but results may vary.
Adjustment Layers
Supported Adjustment Layers (Experimental):
Invert - Color inversion
Posterize - Reduces color levels
Threshold - Converts to black and white based on luminance threshold
Hue/Saturation - Adjusts hue, saturation, and lightness (supports colorize mode)
Exposure - Applies exposure, offset, and gamma correction
Brightness/Contrast - Adjusts brightness and contrast
Color Balance - Adjusts color balance for shadows, midtones, and highlights (with limitations, see below)
Curves - Applies tonal curve adjustments using SVG lookup tables
Levels - Adjusts input/output levels and midpoint gamma correction
Not Yet Implemented:
Black & White - Converts to grayscale with channel-specific controls
Channel Mixer - Remixes color channels with custom ratios
Color Lookup - Applies 3D LUT color grading
Gradient Map - Maps grayscale to gradient colors
Photo Filter - Applies warming/cooling color filters
Selective Color - Adjusts specific color ranges (CMYK-based)
Vibrance - Adjusts saturation with skin tone protection
Technical Limitations:
Adjustment layers in Photoshop apply filters to the combined backdrop of all layers below them. SVG has fundamental architectural limitations that make this difficult to implement correctly:
CSS backdrop-filter: Would be ideal but does not work on SVG elements (only HTML elements)
SVG BackgroundImage: SVG filters’
BackgroundImagefeature has poor browser support and is not available in most rasterizers (including resvg)Current workaround: The experimental implementation wraps backdrop layers in a
<symbol>and uses two<use>elements—one for the original backdrop and one with the filter applied
Critical Limitation - Transparency Not Supported:
The current implementation does not work correctly when the backdrop has transparency. Stacking two semi-transparent <use> elements produces incorrect visual results, as the layers are composited twice.
This means:
Opaque backdrops only: Adjustment layers work reasonably well when all backdrop layers are fully opaque
Transparency breaks: Any transparency in backdrop layers (layer opacity, transparent pixels, or blend modes) will render incorrectly
No clean solution: Without native backdrop-filter support on SVG elements, there is no straightforward way to implement adjustment layers that handle transparency correctly
Workaround: Flatten adjustment layers in Photoshop before conversion, or export a flattened version. This is the recommended approach for production use.
Color Balance Accuracy Limitations
The ColorBalance adjustment layer is implemented using SVG feComponentTransfer filters with 256-value lookup tables. Due to SVG’s independent channel processing architecture, global luminance-based tonal weighting cannot be perfectly emulated.
Implementation Approach:
Uses per-channel grayscale approximation (assumes R≈G≈B for luminance calculation)
Generates three separate lookup tables (one per RGB channel)
Applies Photoshop’s tonal range weighting formulas (shadows/midtones/highlights)
Expected Accuracy:
Perfect (100%): No-op adjustments (all parameters zero)
Excellent (95-99%): Moderate adjustments (±30 to ±70 range)
Good (85-95%): Extreme positive adjustments (+100 on all axes)
Moderate (65-75%): Extreme negative adjustments (-100 on all axes)
Best results: Balanced images with relatively similar RGB values
Known Limitations:
Global luminance: Cannot calculate true RGB luminance (0.299R + 0.587G + 0.114B) due to SVG’s per-channel processing
Neutral color preservation: Photoshop preserves pure neutral colors (white, gray, black) to avoid introducing unwanted color casts. The SVG implementation applies adjustments literally, which can tint neutral colors. For example, white (255, 255, 255) may become slightly tinted when Photoshop would keep it pure white.
Preserve Luminosity mode: Not fully supported - logs warning when enabled (luminosity=1)
Highly saturated colors: May have ~10-15% higher error for pure/saturated colors
Extreme negative adjustments: Severe color clipping when subtracting from low RGB values
File size: Adds ~2-3KB per ColorBalance layer (768 float values in LUTs)
Why This Is Acceptable:
ColorBalance is primarily used for subtle tonal color correction (e.g., warming shadows, cooling highlights), not extreme stylization. The grayscale approximation works well because:
Most images have relatively balanced RGB values in each tonal range
Weighted blending across tonal ranges smooths out approximation errors
Typical adjustments (±30 to ±70) achieve 95%+ accuracy
Visual differences are imperceptible for normal use cases
Technical Background:
SVG’s feComponentTransfer processes RGB channels independently, making it impossible to compute global luminance (which requires access to all three channels simultaneously). SVG filters like feColorMatrix can extract luminance, but feComposite arithmetic operations are limited to linear combinations and cannot perform the conditional, non-linear tonal weight calculations required by ColorBalance (e.g., if L < 0.33 then weight = (0.33 - L) / 0.33).
Workaround: For critical color accuracy requirements, flatten ColorBalance adjustments in Photoshop before conversion.
Smart Objects
Smart Object Features
Smart Object filters: Not supported
Embedded smart objects: Limited support
Linked smart objects: Not supported
Workaround: Rasterize smart objects in Photoshop before conversion if they contain unsupported features.
Text Layers
Text layers can be converted to SVG <text> elements (enable_text=True, default) or rasterized as images (enable_text=False).
Note: Text conversion is experimental and has limitations. For production use, test thoroughly with your target SVG renderers.
Native SVG Text Conversion
When enable_text=True (default), text layers are converted to native SVG <text> elements.
Supported Features:
Text content with multiple paragraphs and styled spans
Font family, size, weight (bold), and style (italic)
Faux bold and faux italic
Font color (solid fill and stroke colors)
Horizontal and vertical writing modes
Text alignment (left, center, right, justify)
Text decoration (underline, strikethrough)
Text transformation (all-caps, small-caps)
Superscript and subscript with accurate positioning
Baseline shift for custom vertical positioning
Letter spacing (tracking)
Kerning: Manual kerning adjustments (per-character pairs) and automatic metrics-based kerning (browser default)
Tsume (East Asian character tightening)
Ligatures (common ligatures and discretionary ligatures)
Line height (leading)
Horizontal and vertical text scaling
Position, rotation, and scaling transformations
Arc warp effects (experimental) - see Text Warp Effects below
Unsupported Features:
Gradient fills and pattern strokes (solid colors only)
Advanced OpenType features (e.g., stylistic sets, contextual alternates, positional forms)
Variable fonts and font variations
Text Warp Effects (Experimental):
Text layers with arc warp effects are converted to SVG <textPath> elements that follow curved paths. This feature is experimental and automatically enabled when arc warp is detected.
Supported Warp Types:
Arc warp (horizontal orientation only)
Positive values (+1 to +100): Arc bulging upward
Negative values (-1 to -100): Arc bulging downward
All intermediate warp values
Not Yet Supported:
Vertical arc warp
Other warp styles (Fish, Wave, Flag, etc.)
Warp perspective transforms
Technical Implementation:
Arc-warped text uses SVG <textPath> with dynamically generated arc paths. The arc radius is calculated using trigonometry:
scale = sin(π/2 × |warp_value|/100)radius = (width + height) / 2 / scale
For extreme warp values (absolute value > 50), the textLength attribute is set to improve browser rendering consistency.
Renderer Compatibility:
✅ Modern browsers: Chrome, Firefox, Safari, Edge (good support)
✅ PlaywrightRasterizer: Full support via Chromium
⚠️ ResvgRasterizer: Basic support, but may have rendering differences
⚠️ Vector editors: Variable support (Inkscape, Sketch, Figma)
Known Limitations:
Height adjustment uses half box height; should ideally use baseline height
Only horizontal orientation supported
Text wrapping with warp not yet implemented
Unsupported warp styles fall back to straight line rendering
Example:
from psd2svg import SVGDocument
from psd_tools import PSDImage
# Text with arc warp is automatically converted to textPath
psdimage = PSDImage.open("curved_text.psd")
document = SVGDocument.from_psd(psdimage)
document.save("output.svg")
Fallback:
To disable text warp conversion and rasterize warped text instead:
document = SVGDocument.from_psd(psdimage, enable_text=False)
Text Wrapping Support:
Text wrapping for bounding box text (ShapeType=1) is supported using <foreignObject> with XHTML/CSS content. This feature is opt-in and disabled by default.
To enable text wrapping:
from psd2svg import SVGDocument
from psd2svg.core.text import TextWrappingMode
from psd_tools import PSDImage
psdimage = PSDImage.open("input.psd")
document = SVGDocument.from_psd(
psdimage,
text_wrapping_mode=TextWrappingMode.FOREIGN_OBJECT
)
foreignObject Renderer Compatibility:
✅ Supported: Modern browsers (Chrome, Firefox, Safari, Edge)
✅ Supported: PlaywrightRasterizer (Chromium-based rasterizer)
❌ Not supported: ResvgRasterizer/resvg-py (the default rasterizer ignores foreignObject)
❌ Not supported: Many SVG tools (PDF converters, design tools like Inkscape/Sketch/Figma)
Important Notes:
foreignObject text cannot be edited in vector graphics editors (appears as embedded HTML)
Point text (ShapeType=0) always uses native SVG
<text>elements, regardless of this settingDefault behavior (
text_wrapping_mode=0) maintains backward compatibility with native SVG textFor web-only SVG display or browser-based rendering, foreignObject provides better text wrapping
For maximum compatibility, leave text wrapping disabled (default)
Paragraph Formatting:
The following paragraph formatting properties are supported in foreignObject mode:
✅ First line indent (
text-indentCSS)✅ Start/end indent (
padding-left/padding-rightCSS)✅ Space before/after (
margin-top/margin-bottomCSS)⚠️ Hanging punctuation (
hanging-punctuationCSS - Safari only)
Hanging Punctuation Browser Support:
✅ Safari 10+
❌ Chrome (not supported)
❌ Firefox (not supported)
❌ Edge (not supported)
The hanging-punctuation property is included in SVG output for future compatibility and Safari users, but will have no effect in other browsers.
Hyphenation Support:
Auto hyphenation (hyphens: auto) is supported in all modern browsers when the lang attribute is set (automatically set to en when hyphenation is enabled):
✅ Chrome/Edge (supports
hyphens: auto)✅ Firefox (supports
hyphens: autoandhyphenate-limit-chars)✅ Safari (supports
hyphens: autoandhyphenate-limit-chars)
However, hyphenate-limit-chars (which controls minimum word length and characters before/after hyphen) has limited support:
❌ Chrome/Edge (not supported)
✅ Firefox 43+ (supported)
✅ Safari 17+ (supported)
PSD’s ConsecutiveHyphens and Zone properties have no CSS equivalents and are not converted.
Native SVG Limitation:
These paragraph formatting properties are only available in foreignObject mode. Native SVG <text> elements do not support paragraph indentation, spacing, hanging punctuation, or hyphenation.
Font Requirements:
Text conversion requires fonts to be installed on the system. The converter uses fontconfig to resolve font names. If a font is not found:
A warning is logged
Text may fall back to a default system font
Results may differ from Photoshop’s rendering
Cross-platform font availability varies—test on your target deployment environment.
SVG Renderer Compatibility:
Rendering quality varies significantly across SVG renderers:
Chromium-based browsers (Chrome, Edge): Best support, including vertical text features
Firefox: Good support with minor differences
Safari: Acceptable support with some limitations
resvg (bundled rasterizer): Does not support:
text-orientation: uprightfor vertical writing modedominant-baselinealignment for vertical texttransformon<tspan>elements (SVG 1.1 limitation for horizontal/vertical scaling)
For best results with vertical text, use Chromium-based browsers for viewing or rendering.
Text Scaling Limitation:
Horizontal and vertical text scaling (horizontal_scale and vertical_scale in PSD) uses transform on <tspan> elements, which is only supported in SVG 2.0. No major browser currently supports this feature (Chrome, Firefox, Safari, and Edge all ignore transforms on tspan elements).
Impact:
Scaled text will not render correctly in any browser
Text appears at normal size instead of scaled size
A warning is logged during conversion
Workarounds:
Recommended: Use
enable_text=Falseto rasterize text layers with scalingConvert text to vector shapes (outlines) in Photoshop before conversion
Avoid using text scaling in your PSD designs
Technical Background:
While splitting scaled spans into separate <text> elements (which do support transforms in browsers) seems like a potential solution, this approach has fundamental issues:
Line height calculations - scaled text affects vertical spacing in complex ways
Transform combination - when layers have their own transforms, matrix multiplication is required
Position calculations - would require knowing rendered text widths without a layout engine
Missing attributes - parent attributes need careful propagation
Given these complexities, the current implementation emits a clear warning rather than attempting unreliable splitting.
Letter Spacing Differences:
Photoshop and SVG use different kerning algorithms, which may result in slight letter spacing differences:
Kerning Types:
Metrics kerning: Uses the font’s built-in kerning tables (kerning pairs)
Optical kerning: Adobe’s proprietary visual analysis algorithm that adjusts spacing based on glyph shapes
Photoshop Behavior:
Uses optical kerning by default when AutoKern is enabled (most common case)
Optical kerning analyzes character shapes and applies visual adjustments beyond font tables
Can also use metrics kerning or manual kerning when explicitly configured
SVG/Browser Behavior:
Uses metrics kerning automatically via the CSS
font-kerning: autoproperty (browser default)Applies the font’s built-in kerning tables without optical adjustments
Manual kerning adjustments from PSD files are preserved via SVG
dx/dyattributes
Why They Differ:
Optical kerning is a proprietary Adobe algorithm that cannot be replicated in SVG. The difference between optical and metrics kerning is expected and inherent to the different rendering engines. Most fonts have well-designed kerning tables, so the visual difference is typically minimal.
Workaround:
To compensate for kerning differences, you can use the text_letter_spacing_offset parameter:
from psd2svg import SVGDocument
from psd_tools import PSDImage
psdimage = PSDImage.open("input.psd")
# Apply a small negative offset to tighten letter spacing
document = SVGDocument.from_psd(
psdimage,
text_letter_spacing_offset=-0.015
)
# Or use a positive offset to loosen spacing
document = SVGDocument.from_psd(
psdimage,
text_letter_spacing_offset=0.01
)
The offset is in pixels and is added to all letter-spacing values. Typical values range from -0.02 to 0.02. You may need to experiment with different values depending on your fonts and target renderers.
Technical Notes:
The
auto_kerningproperty in PSD files indicates optical kerning modeSVG 1.1:
kerning="auto"attribute enables kerning (default)SVG 2.0/CSS:
font-kerning: autoproperty enables kerning (browser default)Manual kerning from PSD is always preserved regardless of the kerning mode
References:
Rasterized Text (Image Fallback)
When enable_text=False, the converter uses the rasterized preview image embedded in the PSD file.
This means:
Text is not editable in the resulting SVG
Text is not selectable or searchable
Scaling may reduce quality since text becomes a raster image
File size increases with embedded raster text
Since text is rasterized:
Text appears exactly as rendered in Photoshop, including all effects
Complex text effects (gradients, strokes, shadows) are preserved
All warp effects (arc, fish, wave, etc.) work correctly
Custom transformations work correctly
No font installation required on the target system
Workarounds:
If you need editable/scalable text: Convert text to vector shapes (outlines) in Photoshop before conversion
If you need smaller file sizes: Use external image export instead of embedded images
If text quality is critical: Export at higher DPI or use the rasterizer with appropriate scaling
3D and Special Features
The following Photoshop features are not supported:
3D layers
Video layers
Animation timeline
Actions and scripts
Layer comps (only the active comp is converted)
Browser Compatibility
SVG Rendering Differences
SVG rendering quality varies significantly across browsers:
Best to Worst:
Chrome/Chromium: Most accurate and feature-complete
Firefox: Good support, minor differences
Safari: Acceptable, some edge cases
Edge: Generally good (Chromium-based)
Recommendation: Test your SVG output in target browsers to ensure acceptable quality.
Known Issues
Filter effects may render differently in different browsers
Some color profiles may not be preserved
Complex gradients may have slight variations
Performance Considerations
Large Files
Complex PSDs: Large files with many layers may result in large SVG files
Many embedded images: Embedding images as data URIs increases file size significantly
Processing time: Complex documents may take time to convert
Workaround:
Use external images instead of embedding:
convert('in.psd', 'out.svg', image_prefix='img_')Simplify layer structure in Photoshop when possible
Merge similar layers
Memory Usage
Large PSD files require significant memory to process
Multiple concurrent conversions may exhaust memory
Thread Safety
IMPORTANT: The psd2svg API is NOT thread-safe.
Do not share
SVGDocumentinstances across threadsDo not perform concurrent operations on the same document
Use separate instances for parallel processing
Rasterizer Stability
resvg-py Error Handling
As of resvg-py 0.2.5 (required by psd2svg), the library properly handles edge cases:
Exception Handling:
Malformed/corrupted SVG content →
ValueErrorMissing SVG files →
ValueErrorEmpty/invalid SVG documents →
ValueError
Error Recovery:
from psd2svg import SVGDocument
try:
document = SVGDocument.from_psd(psd_image)
rasterized = document.rasterize()
except ValueError as e:
print(f"SVG rasterization failed: {e}")
See the Rasterizers documentation for more examples.
Legacy Note: Versions prior to psd2svg 0.11.0 (with resvg-py < 0.2.5) would crash (SIGABRT) instead of raising exceptions. Upgrade to the latest version for proper error handling.
Color Management
Color Space Limitations
CMYK: May not convert accurately to RGB
Lab color: Not supported
Color profiles: May not be fully preserved
Spot colors: Not supported
Workaround: Convert to RGB in Photoshop before conversion for best results.
Precision
Some color values may have minor precision differences due to format conversions.
Vector Shapes
Shape Limitations
Some custom shape tools may not translate perfectly
Vector masks have limitations
Workaround: Simplify paths in Photoshop if conversion issues occur.
Known Workarounds
For Best Results
Simplify layer structure: Merge unnecessary layers
Flatten effects: Rasterize complex effects
Use RGB color mode: Convert from CMYK if needed
Rasterize smart objects: If they contain unsupported features
Test output: Always verify SVG output in target environment
Use external images: For large PSDs with many raster elements
For Production Use
Pre-process PSDs: Create conversion-friendly versions
Automate testing: Test converted SVGs in target browsers
Fallback strategy: Keep rasterized versions as fallback
Version control: Track both PSD and SVG versions
Reporting Issues
If you encounter issues not listed here:
Check if it’s a known limitation
Test with simplified PSD files
Report issues at: https://github.com/kyamagu/psd2svg/issues
Include:
PSD file characteristics (size, layers, features used)
Error messages or unexpected behavior
Expected vs. actual output
Environment details (Python version, OS)