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在评论中指出的那样,
实际上,我正在研究当前的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 *”); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |