我想用Apache PDFBox在PDF上绘制矢量图像。
这是我用来绘制常规图像的代码
PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(1);
PDPageContentStream contentStream = new PDPageContentStream(document, page, true, true);
BufferedImage _prevImage = ImageIO.read(new FileInputStream("path/to/image.png"));
PDPixelMap prevImage = new PDPixelMap(document, _prevImage);
contentStream.drawXObject(prevImage, prevX, prevY, imageWidth, imageHeight);
如果我使用svg
或wmf
图片而不是png,则生成的PDF文档会损坏。
我希望图像成为矢量图像的主要原因是使用PNG或JPG图像看起来很糟糕,我认为它会以某种方式压缩,因此看起来很糟糕。使用矢量图像时,这不应该发生(好吧,当我在Inkscape中将svg路径导出为PDF时,它不会发生,矢量路径会被保留)。
有没有办法使用Apache PDFBox将svg或wmf(或其他矢量)绘制成PDF?
我目前正在使用PDFBox 1.8,如果这很重要。
答案 0 :(得分:3)
请参见pdfbox-graphics2d中吹捧的图书馆this Jira。
您可以通过Batik或Salamander或其他方式将SVG绘制到类def onecount(rem):
count = 0 #counts the number of one bits
while rem != 0 :
highestindex = math.floor(math.log(rem,2))
rem = rem - int(math.pow(2,highestindex))
count += 1
return count
上,该类与iText的PdfBoxGraphics2D
平行。有关示例,请参见GitHub页面。
template.createGraphics()
还有...如果您还想将SVG图形缩放到25%大小:
PDDocument document = ...;
PDPage page = ...; // page whereon to draw
String svgXML = "<svg>...</svg>";
double leftX = ...;
double bottomY = ...; // PDFBox coordinates are oriented bottom-up!
// I set these to the SVG size, which I calculated via Salamander.
// Maybe it doesn't matter, as long as the SVG fits on the graphic.
float graphicsWidth = ...;
float graphicsHeight = ...;
// Draw the SVG onto temporary graphics.
var graphics = new PdfBoxGraphics2D(document, graphicsWidth, graphicsHeight);
try {
int x = 0;
int y = 0;
drawSVG(svg, graphics, x, y); // with Batik, Salamander, or whatever you like
} finally {
graphics.dispose();
}
// Graphics are not visible till a PDFormXObject is added.
var xform = graphics.getXFormObject();
try (var contentWriter = new PDPageContentStream(document, page, AppendMode.APPEND, false)) { // false = don't compress
// XForm objects have to be placed via transform,
// since they cannot be placed via coordinates like images.
var transform = AffineTransform.getTranslateInstance(leftX, bottomY);
xform.setMatrix(transform);
// Now the graphics become visible.
contentWriter.drawForm(xform);
}
答案 1 :(得分:0)
我是这样做的,但不是直接的。 首先使用FOP librairy和Batik将您的SVG文档转换为PDF文档。 https://xmlgraphics.apache.org/fop/dev/design/svg.html
第二次,您可以使用pdfbox中的LayerUtility在PDXObjectForm中转换新的pdf文档。之后,只需要在最终的pdf文档中包含PDXObjectForm。
答案 2 :(得分:0)
对我来说,加载SVG文件并将其覆盖在PDF文件上的最终可行解决方案(这将SVG呈现在PDF文档左下角(0,0)坐标的500x500框中):
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-apache-client4</artifactId>
<version>1.19.4</version>
</dependency>
请从此处使用svgSalamander: laravel doc
请使用Coemgenus提出的建议来缩放最终覆盖的SVG。我尝试了第二个选项,效果很好。
Nirmal