2013-08-09 2 views
3

Я использую Java для вывода вывода на PDDocument, а затем добавляет этот документ к существующему, прежде чем отправлять его клиенту.Как вы отслеживаете местоположение вывода PDPageContentStream?

Большая часть работы хорошо работает. У меня есть небольшая проблема, пытающаяся справиться с переполнением содержимого при записи на PDDocument. Я хочу отслеживать, где текст вставляется в документ, так что, когда «курсор», так сказать, пройдет мимо определенной точки, я создам новую страницу, добавлю ее в документ, создаю новый поток контента , и продолжаются как обычно.

Вот код, который показывает, что я хотел бы сделать:

// big try block 
PDDocument doc = new PDDocument(); 
PDPage page = new PDPage(); 
doc.addPage(page); 
PDPageContentStream content = new PDPageContentStream(doc, page); 
int fontSize = 12; 

content.beginText(); 
content.setFont(...); 
content.moveTextPositionByAmount(margin, pageHeight-margin); 
for (each element in a collection of values) { 
    content.moveTextPositionByAmount(0, -fontSize); // only moves down in document 

    // at this point, check if past the end of page, if so add a new page 
    if (content.getTextYPosition(...) < margin) { // wishful thinking, doesn't exist 
     content.endText(); 
     content.close(); 
     page = new PDPage(); 
     doc.addPage(page); 
     content = new PDPageContentStream(doc, page); 
     content.beginText(); 
     content.setFont(...); 
     content.moveTextPositionByAmount(margin, pageHeight-(margin+fontSize)); 
    } 
    content.drawString(...); 
} 
content.endText(); 
content.close(); 

Важный бит является content.getTextYPosition(). Это на самом деле не существует, но я уверен, что PDPageContentStream должен отслеживать аналогичное значение. Есть ли способ получить доступ к этой ценности?

Спасибо.

+0

* Я уверен, что PDPageContentStream должен отслеживать аналогичное значение * - это не так. – mkl

+0

Как он не может отслеживать это где-то? Как бы он помнил, где продолжить вывод текста? –

+1

'PDPageContentStream' не нужно помнить: все, что он делает в этом контексте, - это написать команды, которые вы передаете в поток в PDF. Интерпретация этих команд выполняется программой просмотра PDF. Таким образом, только просмотрщик PDF должен отслеживать его, а не PDFBox. – mkl

ответ

2

Создайте переменную heightCounter, которая отслеживает, насколько вы переместили местоположение текста. Это начальное значение может быть вашей исходной позицией Y.

 PDRectangle mediabox = page.findMediaBox(); 
     float margin = 72; 
     float width = mediabox.getWidth() - 2 * margin; 
     float startX = mediabox.getLowerLeftX() + margin; 
     float startY = mediabox.getUpperRightY() - margin; 
     float heightCounter = startY; 

Каждый раз, когда вы перемещаете позицию текста, вычитать, что из вашего heightCounter. Когда heightCounter меньше, чем вы перемещаете текстовое положение, создайте новую страницу.

+0

Oop, да, это, по сути, то, что я закончил делать. Спасибо за ответ. –