2014-01-20 2 views
0

Я добавил новые тексты в выходящий PDF-файл, но шрифты и местоположения ушли. Место должно быть 100, 500 с кодами тестирования. Но он появляется примерно в 10:50 с чрезвычайно маленьким шрифтом вместо 12.PDFBox: проблемы с шрифтами и тексты добавленных текстов

Я проверил внутреннюю структуру pdf с iText Rup и обнаружил, что медиабакс pdf имеет (0,0612,792). Однако существующие потоки показывают очень странные координаты, например:

0.12 0 0 0.12 0 0 cm 
BT 
/F1 70 Tf 
0 6600 Td 
3001 -6274 Td 
0 Tw 
(© All rights reserved.) Tj 
ET 
BT 
/F1 70 Tf 
0 6600 Td 
2365 -6274 Td 
0 Tw 
(Page 1 of 4) Tj 
ET 
BT 
/F1 70 Tf 
0 6600 Td 
180 -6274 Td 
0 Tw 

Похоже, что размер шрифта в потоке 70, что не так (размер шрифта должен быть около 7). И координаты, такие как 6600, намного выше медианного. Я бы предположил, что это может привести к тому, что вновь добавленные тексты появятся в неправильных местах и ​​меньших шрифтах.

Знаете ли вы, есть ли способы настроить размер и расположение шрифта так, чтобы они отображались в правильных местах и ​​размере шрифта?

Любая помощь очень ценится.

Вот коды тестирования:

PDDocument document = PDDocument.load(new File(file)); 

    PDFont font = PDType1Font.HELVETICA_BOLD; 

    List<PDPage> pages = document.getDocumentCatalog().getAllPages(); 
    PDPage page = pages.get(0); 

    PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false); 
    contentStream.setFont(font, 12); 
    contentStream.beginText(); 
    contentStream.moveTextPositionByAmount(100, 500); 
    contentStream.drawString("hello, this is a test"); 
    contentStream.endText(); 

    contentStream.close(); 

    document.save("c:/temp/test.pdf"); 
    document.close(); 

ответ

1

Проверьте ваши любимые ссылки PDF. Самая первая строка,

0.12 0 0 0.12 0 0 cm 

устанавливает базовую матрицу преобразования для остальной части страницы в масштабе 12/100th. В этом масштабе размер шрифта «70», масштабированный, выходит на 8,4 очков. Чтобы получить собственный текст размером 12pt, используйте 12/0.12 = 100 (масштабированные единиц, а не «фактические очки»). Сделайте то же самое для своих координат позиции.

+0

спасибо много для такой быстрой реакции, Jongware. Есть ли в PDFBox утилиты для получения этой матрицы преобразования? Еще раз спасибо. – user2254613

+0

@ user2254613: Введя его в Google, я получил [ссылку для PDGraphicsState] (http://pdfbox.apache.org/docs/1.8.3/javadocs/org/apache/pdfbox/pdmodel/graphics/PDGraphicsState.html) как первый хит: используйте getCurrentTransformationMatrix. – usr2564301

+0

@ user2254613 Чтобы использовать «PDGraphicsState», вам необходимо проанализировать поток (-ы) контента. Если вам это еще не нужно, тем проще будет конвертировать существующий контент с помощью ** q ** и ** Q **. – mkl

0

Вы должны использовать следующий конструктор при создании потока контента с resetContext установлен на «истинный»:

public PDPageContentStream(PDDocument document, PDPage sourcePage, boolean appendContent, boolean compress, boolean resetContext) throws IOException 

Это сбросит контекст наволакивания существующего содержимого с д и Q.

Смежные вопросы