me encontré con un par de ejemplos por el iText autor que usa la API Graphics2D y la biblioteca Apache Batik para dibujar el SVG en un PDF.
http://itextpdf.com/examples/iia.php?id=269
http://itextpdf.com/examples/iia.php?id=263
Para mis propósitos, que tenía que tomar una serie de SVG y dibujar que en un PDF en un determinado tamaño y la ubicación mientras se mantiene la naturaleza del vector de la imagen (sin rasterización) .
Quería omitir el archivo SVG que parece ser frecuente en las funciones SAXSVGDocumentFactory.createSVGDocument(). La siguiente publicación me resultó útil para usar una cadena de texto SVG en lugar de un archivo plano.
http://batik.2283329.n4.nabble.com/Parse-SVG-from-String-td3539080.html
usted tiene que crear un StringReader de su cadena y pasar a la que (, Cadena lector) método SAXSVGDocumentFactory # createDocument. El URI que pase como primer parámetro como String será el URI del documento base del documento SVG. Esto solo debería ser importante si su SVG hace referencia a cualquier archivo externo.
Saludos,
Daniel
Java Fuente derivados de los ejemplos iText:
// 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();
Tenga en cuenta que esto va a dibujar un SVG para el PDF que se está trabajando. El SVG aparece como una capa flotante sobre el texto. Todavía estoy trabajando en moverlo/escalarlo y tenerlo en línea con el texto, pero espero que esté fuera del alcance inmediato de la pregunta.
Espero que haya sido capaz de ayudar.
Saludos
EDIT: yo era capaz de poner en práctica mi SVG como un objeto en línea usando la siguiente. Las líneas comentadas son para agregar un borde rápido para verificar el posicionamiento.
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);
Obtuve una excepción cuando probé su código, esto no funciona, he leído recientemente que no es compatible con eps, debe convertirlo a WMF – Deumber