ich ein paar Beispiele von der iText gefunden Autor, der die Graphics2D-API und die Apache Batik-Bibliothek verwendet, um die SVG in eine PDF zu zeichnen.
http://itextpdf.com/examples/iia.php?id=269
http://itextpdf.com/examples/iia.php?id=263
Für meine Zwecke, ich brauchte eine Reihe von SVG zu nehmen und dass in einem PDF zu einer bestimmten Größe und Lage zu zeichnen, während der Vektor Natur des Bildes beibehalten (keine Rasterung) .
Ich wollte die SVG-Datei umgehen, die in den SAXSVGDocumentFactory.createSVGDocument() - Funktionen vorherrschend scheint. Ich fand den folgenden Beitrag hilfreich für die Verwendung einer SVG-Textzeichenfolge anstelle einer flachen Datei.
http://batik.2283329.n4.nabble.com/Parse-SVG-from-String-td3539080.html
Sie haben einen String aus Ihrem String erstellen und an die SAXSVGDocumentFactory # create (String, Reader) Methode übergeben. Der URI, den Sie als ersten Parameter als String übergeben, ist der Basisdokument-URI des SVG-Dokuments. Dies sollte nur wichtig sein, wenn Ihr SVG auf externe Dateien verweist.
Mit freundlichen Grüßen,
Daniel
Java Quelle abgeleitet von den iText Beispiele:
// SVG as a text string.
String svg = "<svg>...</svg>";
// Create the PDF document.
// rootPath is the present working directory path.
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(new File(rootPath + "svg.pdf")));
document.open();
// Add paragraphs to the document...
document.add(new Paragraph("Paragraph 1"));
document.add(new Paragraph(" "));
// Boilerplate for drawing the SVG to the PDF.
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
UserAgent userAgent = new UserAgentAdapter();
DocumentLoader loader = new DocumentLoader(userAgent);
BridgeContext ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
GVTBuilder builder = new GVTBuilder();
PdfContentByte cb = writer.getDirectContent();
// Parse the SVG and draw it to the PDF.
Graphics2D g2d = new PdfGraphics2D(cb, 725, 400);
SVGDocument chart = factory.createSVGDocument(rootPath, new StringReader(svg));
GraphicsNode chartGfx = builder.build(ctx, chart);
chartGfx.paint(g2d);
g2d.dispose();
// Add paragraphs to the document...
document.add(new Paragraph("Paragraph 2"));
document.add(new Paragraph(" "));
document.close();
Beachten Sie, dass dies ein SVG zum PDF ziehen werden Sie gerade arbeiten. Das SVG wird als schwebende Ebene über dem Text angezeigt. Ich arbeite immer noch daran, sie zu verschieben/zu skalieren und sie mit Text zu verknüpfen, aber hoffentlich liegt das außerhalb des unmittelbaren Bereichs der Frage.
Hoffe, das konnte helfen.
Prost
EDIT: Ich konnte meinen svg als Inline-Objekt implementieren die folgenden verwenden. Die kommentierten Zeilen dienen zum Hinzufügen eines schnellen Rahmens, um die Positionierung zu überprüfen.
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(XMLResourceDescriptor.getXMLParserClassName());
UserAgent userAgent = new UserAgentAdapter();
DocumentLoader loader = new DocumentLoader(userAgent);
BridgeContext ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
GVTBuilder builder = new GVTBuilder();
SVGDocument svgDoc = factory.createSVGDocument(rootPath, new StringReader(svg));
PdfTemplate svgTempl = PdfTemplate.createTemplate(writer, Float.parseFloat(svgDoc.getDocumentElement().getAttribute("width")), Float.parseFloat(svgDoc.getDocumentElement().getAttribute("height")));
Graphics2D g2d = new PdfGraphics2D(svgTempl, svgTempl.getWidth(), svgTempl.getHeight());
GraphicsNode chartGfx = builder.build(ctx, svgDoc);
chartGfx.paint(g2d);
g2d.dispose();
Image svgImg = new ImgTemplate(svgTempl);
svgImg.setAlignment(Image.ALIGN_CENTER);
//svgImg.setBorder(Image.BOX);
//svgImg.setBorderColor(new BaseColor(0xff, 0x00, 0x00));
//svgImg.setBorderWidth(1);
document.add(svgImg);
Ich bekomme eine Ausnahme, wenn ich Ihren Code versuchte, dies funktioniert nicht für mich, ich lese kürzlich, dass eps nicht unterstützt wird, müssen Sie es in WMF konvertieren – Deumber