Я нашел пару примеров от автора iText, которые используют API Graphics2D и библиотеку Apache Batik для рисования SVG в PDF.
http://itextpdf.com/examples/iia.php?id=269
http://itextpdf.com/examples/iia.php?id=263
Для моих целей мне нужно было взять строку SVG и нарисовать ее в PDF-файле с определенным размером и местоположением, сохраняя векторный характер изображения (без растеризации).
Я хотел обойти файл SVG, который, кажется, преобладает в функциях SAXSVGDocumentFactory.createSVGDocument (). Я нашел следующий пост полезным для использования текстовой строки SVG вместо простого файла.
http://batik.2283329.n4.nabble.com/Parse-SVG-from-String-td3539080.html
Вы должны создать StringReader из вашей String и передать его методу SAXSVGDocumentFactory # createDocument (String, Reader). URI, который вы передаете в качестве первого параметра в виде строки, будет URI базового документа SVG-документа. Это должно быть важно, только если ваш SVG ссылается на какие-либо внешние файлы.
С уважением,
Даниил
Источник Java, полученный из примеров 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();
Обратите внимание, что это приведет к созданию SVG для PDF-файла, с которым вы работаете. SVG отображается как плавающий слой над текстом. Я все еще работаю над его перемещением / масштабированием и сохраняю его встроенным в текст, но, надеюсь, это выходит за рамки вопроса.
Надеюсь, это помогло.
Приветствия
РЕДАКТИРОВАТЬ: я смог реализовать свой SVG как встроенный объект, используя следующее. Комментированные строки предназначены для добавления быстрой рамки для проверки позиционирования.
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);