如何跟踪 PDPageContentStream 文本输出的位置?

Jun*_*Lee 5 java pdfbox

我正在使用 Java 将输出写入 a PDDocument,然后将该文档附加到现有文档,然后再将其提供给客户端。

其中大部分运行良好。我只有一个小问题试图在写入时处理内容溢出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();
Run Code Online (Sandbox Code Playgroud)

重要的一点是content.getTextYPosition(). 它实际上并不存在,但我确信PDPageContentStream必须跟踪类似的值。有没有办法访问这个值?

谢谢。

Cat*_*hwa 4

创建一个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;
Run Code Online (Sandbox Code Playgroud)

每次移动文本位置时,请从您的heightCounter. 当heightCounter小于您要移动的文本位置时,然后创建一个新页面。