Apache PDFBox отрисовывает прямую линию, изогнутую в PNG - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть PDF, который при рендеринге в png выводит кривую линию, точнее с шагом в ней.Это PDF и как он должен выглядеть: https://drive.google.com/file/d/1E-zucbreD7pVwWc3Z4MNe_lzsP6D9m49/view

Вот полный рендеринг PNG с использованием PDFBox 2.0.13 и openjdk версии 1.8.0_181: enter image description here

А вот конкретная часть PNG, которая имеет шаг: enter image description here

1 Ответ

0 голосов
/ 14 февраля 2019

Выдержка из потока содержимого страницы:

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 или передавая renderHints в PDFRenderer.setRenderingHints().Однако сейчас это недоступно, но будет доступно в версии 2.0.14 (см. Выпуск PDFBOX-4435 , попробуйте снимок ).И вы можете ожидать, что рендеринг будет плохого качества, не имея сглаживания.

Обновление: вместо удаления упомянутой выше строки, добавьте эту:

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

Source.

...