Поведение масштабирования текстовой матрицы PDFBox - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблемы с пониманием поведения PDFBox при попытке добавить текст в поток содержимого страницы. Я использую образец отсканированного PDF, который является просто растровым изображением, наложенным на страницу. Мои практические знания по внутренним файлам PDF являются базовыми, поэтому я могу ошибиться.

http://solutions.weblite.ca/pdfocrx/scansmpl.pdf

Я использую PDFBox 2.0.11 с sbt: "org.apache.pdfbox" % "pdfbox" % "2.0.11"

Мой первый шаг - создать поток контента и написать «привет мир» в PDF, что я выполнил следующим образом:

// val pdf: PDDocument
val page = pdf.getPages(0)
val contentStream = new PDPageContentStream(pdf, page, false, true)
contentStream.beginText()
contentStream.newLineAtOffset(0, 0)
contentStream.setFont(PDType1Font.COURIER, 12)
contentStream.showText("Hello, world!")
contentStream.endText()
contentStream.close()

Это работает, и текст отображается в левом нижнем углу, где я и ожидал. Но это, конечно, перезаписывает растровое изображение, а это не то, что я хочу. Поэтому я изменяю конструктор PDPageContentStream на (pdf, page, true, true), чтобы добавить его в поток контента.

Теперь у меня странное поведение, которого я не понимаю. Текст показывает огромный . Настолько большой, что я вижу только нижний угол H, потому что он как минимум в 10 раз больше самой страницы. Я думаю, это означает, что происходит какое-то висящее матричное преобразование? Я не уверен, что полностью понимаю, как работают операции преобразования в PDF. PDFBox, кажется, подразумевает, что вызов setTextMatrix заменяет существующую матрицу новой, а не относительно существующей текстовой матрицы. Я могу сделать текст видимым (и близким к нормальному размеру) с помощью этого:

val affine = new AffineTransform()
affine.setToIdentity()
affine.scale(0.002, 0.002)
// code
contentStream.setTextMatrix(new Matrix(affine))

Который я обнаружил только методом проб и ошибок. В любом случае я не вижу, чтобы получить текущее состояние матрицы преобразования, кроме ширины страницы .getMatrix(), но это, похоже, возвращает идентичность независимо от того, добавляю я или перезаписываю, поэтому я не думаю это так. Кроме того, если я применяю другую текстовую матрицу с точно таким же вызовом, что и в последней строке в предыдущем блоке, она масштабируется относительно предыдущего масштаба, поэтому я получаю второй текстовый блок, масштаб которого слишком мал, чтобы его можно было увидеть.

Как мне получить текущую матрицу преобразования, чтобы я мог инвертировать ее для достижения желаемого фактического масштабирования?

Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2018

Похоже, что это была проблема. Я не видел конструктор с 5-м аргументом для resetContext раньше. Я до сих пор не уверен, как вы получите текущий контекст, если вам по какой-то причине нужно что-то сделать относительно этого контекста. В моем случае добавление 5-го аргумента решает проблему.

PDFBox: PDPageContentStream не работает в режиме добавления

...