У меня проблемы с пониманием поведения 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()
, но это, похоже, возвращает идентичность независимо от того, добавляю я или перезаписываю, поэтому я не думаю это так. Кроме того, если я применяю другую текстовую матрицу с точно таким же вызовом, что и в последней строке в предыдущем блоке, она масштабируется относительно предыдущего масштаба, поэтому я получаю второй текстовый блок, масштаб которого слишком мал, чтобы его можно было увидеть.
Как мне получить текущую матрицу преобразования, чтобы я мог инвертировать ее для достижения желаемого фактического масштабирования?
Спасибо!