Apache PDFBox在PNG中呈现直线弯曲

问题描述 投票:1回答:1

我有一个PDF,当我将它渲染到png时,它会使一条线弯曲,或者更确切地说是一条线。这是PDF以及它应该是什么样子:https://drive.google.com/file/d/1E-zucbreD7pVwWc3Z4MNe_lzsP6D9m49/view

这是使用PDFBox 2.0.13和openjdk版本1.8.0_181的完整PNG渲染:enter image description here

以下是PNG的具体部分:enter image description here

java pdf pdfbox
1个回答
0
投票

页面内容流的摘录:

q
1 0 0 1 35.761 450.003 cm
0 i
0.75 w
0 0 m
50.923 0 l
S
Q

q
1 0 0 1 86.139 450 cm
0 i
0.75 w
0 0 m
14.9 0 l
S
Q

(“cm”是仿射变换,“m”是moveto,“l”是lineto)。可以看出两条线略有不同,一条在450.003,另一条在450。

这里有一些代码通过复制PDFBox正在做的事情来模拟错误:

BufferedImage bim = new BufferedImage(612, 792, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) bim.getGraphics();
RenderingHints r = new RenderingHints(null);
r.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
r.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
r.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.addRenderingHints(r);
g.translate(0, 792);
g.scale(1, -1);
g.setStroke(new BasicStroke(0.75f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10));
g.setColor(Color.black);
GeneralPath path = new GeneralPath();
path.moveTo(35.761f, 450.003f);
path.lineTo(35.761f + 50.923f, 450.003f);
g.draw(path);
path = new GeneralPath();
path.moveTo(86.139f, 450f);
path.lineTo(86.139f + 14.9f, 450f);
g.draw(path);
g.dispose();
ImageIO.write(bim, "png", new File("...."));

人们可以通过评论这一行来摆脱错误:

r.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

这可以在PDFBox的源代码中完成,或者通过在PDFRenderer.setRenderingHints()中传递renderingHints来完成。然而,现在没有一个,但将在2.0.14中提供(请参阅问题PDFBOX-4435,尝试snapshot)。而且,由于没有抗锯齿,您可以预期渲染质量很差。

更新:不添加上述行,而是添加以下内容:

r.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

Source

© www.soinside.com 2019 - 2024. All rights reserved.