Hi List,

I came across a problem with the SVG rendering onto a PDF:

The units seem to be wrong or I am doing a mistake.

When I let Batik parse my SVG image:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; width="126pt" height="25pt" 
viewBox="0 0 126 25" version="1.1">
<g id="surface2">
<rect x="0" y="0" width="126" height="25" 
style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
<path style=" 
stroke:none;fill-rule:evenodd;fill:rgb(81.176471%,85.098039%,69.411765%);fill-opacity:1;"
 d="M 5.5 5.5 L 34.5 5.5 L 34.5 19.5 L 5.5 19.5 Z M 5.5 5.5 "/>
...
</g>
</svg>


My Java code is as follows:

                        PdfContentByte dc = context.getDirectContent();
                        URI uri = URI.create(iconItem);
                        URL url = uri.toURL();
                        SVGDocumentFactory factory = new 
SAXSVGDocumentFactory(XMLResourceDescriptor.getXMLParserClassName());
                              UserAgent userAgent = new UserAgentAdapter();
                            DocumentLoader loader = new 
DocumentLoader(userAgent);
                            BridgeContext ctx = new BridgeContext(userAgent, 
loader);
                          ctx.setDynamicState(BridgeContext.DYNAMIC);
                          SVGDocument svgDoc = factory.createSVGDocument(null, 
url.openStream());
                          GVTBuilder builder = new GVTBuilder();
                          GraphicsNode graphics = builder.build(ctx, svgDoc);
                              String svgWidthString = 
svgDoc.getDocumentElement().getAttribute("width");
                              String svgHeightString = 
svgDoc.getDocumentElement().getAttribute("height");
                              float svgWidth = 
Float.valueOf(svgWidthString.substring(0, svgWidthString.length() - 2));
                              float svgHeight = 
Float.valueOf(svgHeightString.substring(0, svgHeightString.length() - 2));
                        PdfTemplate map = dc.createTemplate(svgWidth*1.25f, 
svgHeight*1.25f);
                              //PdfTemplate map = dc.createTemplate(svgWidth, 
svgHeight);
                        Graphics2D g2d = map.createGraphics(svgWidth*1.25f, 
svgHeight*1.25f);
                        graphics.paint(g2d);
                        g2d.dispose();
                        System.out.println("w="+ svgWidth +" h="+ svgHeight +" 
maxW="+ maxIconWidth +" maxH="+ maxIconHeight);
                        //...
                        Image image = Image.getInstance(map);
PdfPCell cell = new PdfPCell(...);
cell.add(image);

I looked up the SVG specifications and found that pt is 1.25 pixels. However, 
this renders wrongly on the PDF. The image becomes too big and is cut off. When 
I enter 1.5f instead of 1.25f above, it seems more correct but still a bit out.

I don't want to hack together a number that will just happen to look right, 
because it is the wrong approach. Is there some kind of trickiness with the 
units between SVG and PDF (using iText)?

Help is much appreciated. I am working on the legends' rendering in SVG in the 
MapFish print module and will submit the source back to the project, so I think 
they would appreciate your input too.

Kind regards,
Tim

________________________________
Please consider the environment before printing this email
Warning: This electronic message together with any attachments is confidential. 
If you receive it in error: (i) you must not read, use, disclose, copy or 
retain it; (ii) please contact the sender immediately by reply email and then 
delete the emails.
The views expressed in this email may not be those of Landcare Research New 
Zealand Limited. http://www.landcareresearch.co.nz

Reply via email to