[ https://issues.apache.org/jira/browse/FOP-3135?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17745491#comment-17745491 ]
Dave Roxburgh commented on FOP-3135: ------------------------------------ Further work focussed on the possibility of the issue being caused by a mismatch between of FOP's default resolution of 72dpi and SVG's default resolution of 96dpi. [^WIP.patch] makes 2 changes: 1) SVGUserAgent sets pixelUnitToMM to a value suitable for use at 96dpi instead of delegating to FOUserAgent which had set it to a value suitable for use at 72dpi. This change may possibly be safe for general use. It resolves the horizontal glyph spacing issue and the vertical line spacing issue. 2) FOPGVTFontFamily.deriveFont() scales the font size up by a factor of 96/72 - again converting the font size for use at 96dpi instead of 72dpi. This change is clearly not a general solution. Run against MI-test.fo and MI-tspan.svg, the mods produce the output shown in [^WIP-out.pdf] which looks correct. > SVG <tspan> content is displayed on a single line without spaces > ---------------------------------------------------------------- > > Key: FOP-3135 > URL: https://issues.apache.org/jira/browse/FOP-3135 > Project: FOP > Issue Type: Bug > Components: image/svg > Reporter: Julien Lacour > Priority: Minor > Attachments: MI-out-patch.pdf, MI-out.pdf, MI-test.fo, MI-tspan.svg, > MI.patch, WIP-out.pdf, WIP.patch, tspan.svg > > > We have found an issue in FOP when transforming PDFs with SVGs containing > <tspan> with multiple @x and/or @y attributes values. > The problem is located in > org.apache.fop.svg.PDFTextPainter.writeGlyphs(FOPGVTGlyphVector, > GeneralPath), the positions given by x and y are never used when set. > A possible fix for this issue is the following: > {code:java} > for (int i = 0, n = gv.getNumGlyphs(); i < n; i++) { > int gc = gv.getGlyphCode(i); > int[] pa = ((i > dp.length) || (dp[i] == null)) ? > paZero : dp[i]; > if (gv.getGlyphPosition(i) != null) { > Point2D gp = gv.getGlyphPosition(i); > double x = gp.getX() - initialPos.getX(); > double y = -(gp.getY() - initialPos.getY()); > double xd = x - xoLast; > double yd = y - yoLast; > textUtil.writeTd(xd, yd); > textUtil.writeTj((char) gc, true, false); > xc = x + pa[2]; > yc = y + pa[3]; > xoLast = x; > yoLast = y; > } else { > double xo = xc + pa[0]; > double yo = yc + pa[1]; > double xa = f.getWidth(gc); > double ya = 0; > double xd = (xo - xoLast) / 1000f; > double yd = (yo - yoLast) / 1000f; > > textUtil.writeTd(xd, yd); > textUtil.writeTj((char) gc, true, false); > xc += xa + pa[2]; > yc += ya + pa[3]; > xoLast = xo; > yoLast = yo; > } > } > {code} > I also attached an example for testing, it can be opened in Batik for > comparison. -- This message was sent by Atlassian Jira (v8.20.10#820010)