使用 Apache PDFBox 添加文本时如何移动到下一行

How to move to the next line when adding text using Apache PDFBox

我刚刚开始使用 Apache PDFBox 并尝试使用我发现的各种示例。

但是,我一直找不到在添加文本时移动到下一行的简单方法。

例如

PDPageContentStream content = new PDPageContentStream(document, page);
PDFont font = PDType1Font.HELVETICA;
content.beginText();
content.setFont(font, 12);
content.moveTextPositionByAmount(x, y);
content.drawString("Some text.");
content.endText();

为了在下面添加另一行文本,我不得不反复试验 moveTextPositionByAmount 中的 y 值,直到它不会覆盖上一行。

有没有更直观的方法可以算出下一行的坐标是多少?

TIA

PDFBox API 允许生成低级内容。这意味着您必须自己做(但也可以做)大部分布局工作,其中包括决定向下移动多少才能到达下一个基线。

该距离(在此上下文中称为 leading)取决于多种因素:

  • 使用的字体大小(很明显)
  • 文本显示的间隔有多紧或多松
  • 所涉及的行上存在位于常规行之外的元素,例如上标、下标、公式、...

标准的安排使得紧密间隔的文本行的标称高度为 1 个单位 对于以大小 1 绘制的字体。因此,通常您将使用 1..1.5 倍字体大小的前导,除非行上有 material 超出它。

顺便说一句,如果你必须经常以相同的数量转发到下一行,你可以使用 PDPageContentStream 方法的组合 setLeadingnewLine 而不是 moveTextPositionByAmount:

content.setFont(font, 12);
content.setLeading(14.5f);
content.moveTextPositionByAmount(x, y);
content.drawString("Some text.");
content.newLine();
content.drawString("Some more text.");
content.newLine();
content.drawString("Still some more text.");

PS:看来moveTextPositionByAmount会在2.0.0版本中弃用,被newLineAtOffset取代。

PPS:正如 OP 在评论中指出的那样,

There is no PDPageContentStream method called setLeading. I'm using PDFBox version 1.8.8.

确实,我正在查看当前的 2.0.0-SNAPSHOT 开发版本。它们目前是这样实现的:

/**
 * Sets the text leading.
 *
 * @param leading The leading in unscaled text units.
 * @throws IOException If there is an error writing to the stream.
 */
public void setLeading(double leading) throws IOException
{
    writeOperand((float) leading);
    writeOperator("TL");
}

/**
 * Move to the start of the next line of text. Requires the leading to have been set.
 *
 * @throws IOException If there is an error writing to the stream.
 */
public void newLine() throws IOException
{
    if (!inTextMode)
    {
        throw new IllegalStateException("Must call beginText() before newLine()");
    }
    writeOperator("T*");
}

可以使用 appendRawCommands((float) leading); appendRawCommands(" TL");appendRawCommands("T*");

轻松实现外部辅助方法来做等效的事情

像这样在 y 轴上添加一个偏移量的新行

PDPageContentStream content = new PDPageContentStream(document, page);
PDFont font = PDType1Font.HELVETICA;
content.beginText();
content.setFont(font, 12);
// by default y = 0 pdf text start in the left bottom corner 
//  so you may need to put y = 700 or something to see the new line below 
content.moveTextPositionByAmount(x, y);
content.drawString("Some text.");
content.newLineAtOffset(0, -15);
content.drawString("some text ");
content.endText();