使用 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
方法的组合 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*");
轻松实现外部辅助方法来做等效的事情
像这样在 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();
我刚刚开始使用 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
方法的组合 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*");
像这样在 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();