java – 使用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允许生成低级内容.这意味着你必须自己做(而且你也可以这么做)大部分布局工作,其中包括决定向下移动到下一个基线的程度.

该距离(在此背景下称为领先)取决于许多因素:

>使用的字体大小(显然)
>文本应如何紧密或松散地分开
>所涉及的线上元素的存在位于常规线之外,例如上标,下标,公式,……

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

顺便说一句,如果你必须经常以相同的数量转发到下一行,你可以使用PDPageContentStream方法setLeading和newLine的组合而不是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 *”);

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...