如何使用PDFBox drawString插入换行符

我必须用表制作PDF。 到目前为止它工作正常,但现在我想添加一个包装function。 所以我需要插入换行符。

contentStream.beginText(); contentStream.moveTextPositionByAmount(x, y); contentStream.drawString("Some text to insert into a table."); contentStream.endText(); 

我想在“插入”之前添加“ \n ”。 我尝试了“ \u000A ”这是换行的hex值,但是Eclipse向我显示错误。

是否可以使用drawString添加换行符?

pdf格式不知道换行符。 您必须使用moveTextPositionByAmount拆分字符串并将文本位置移动到下一行。

这不是一个特殊的“pdfbox-feature”,它是由pdf格式定义引起的; 所以没有办法使用drawString,也没有其他方法可以调用支持换行。

PDF格式允许换行,但PDFBox没有用于换行符的内置function。

要在PDF中使用换行符,您必须定义要与TL -operator一起使用的前导。 T*运算符进行换行。 ' -operator将给定的文本写入下一行。 (有关详细信息,请参阅PDF规范,“文本”一章。不是那么多。)

这是两个代码片段。 两者都是相同的,但第一个片段使用' ,第二个片段使用T*

 private void printMultipleLines( PDPageContentStream contentStream, List lines, float x, float y) throws IOException { if (lines.size() == 0) { return; } final int numberOfLines = lines.size(); final float fontHeight = getFontHeight(); contentStream.beginText(); contentStream.appendRawCommands(fontHeight + " TL\n"); contentStream.moveTextPositionByAmount(x, y); contentStream.drawString(lines.get(0)); for (int i = 1; i < numberOfLines; i++) { contentStream.appendRawCommands(escapeString(lines.get(i))); contentStream.appendRawCommands(" \'\n"); } contentStream.endText(); } private String escapeString(String text) throws IOException { try { COSString string = new COSString(text); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); string.writePDF(buffer); return new String(buffer.toByteArray(), "ISO-8859-1"); } catch (UnsupportedEncodingException e) { // every JVM must know ISO-8859-1 throw new RuntimeException(e); } } 

使用T*换行:

 private void printMultipleLines( PDPageContentStream contentStream, List lines, float x, float y) throws IOException { if (lines.size() == 0) { return; } final int numberOfLines = lines.size(); final float fontHeight = getFontHeight(); contentStream.beginText(); contentStream.appendRawCommands(fontHeight + " TL\n"); contentStream.moveTextPositionByAmount( x, y); for (int i = 0; i < numberOfLines; i++) { contentStream.drawString(lines.get(i)); if (i < numberOfLines - 1) { contentStream.appendRawCommands("T*\n"); } } contentStream.endText(); } 

要获得字体的高度,您可以使用此命令:

 fontHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize; 

您可能希望将其乘以某些线间距因子。

因为PDF模型通常不是手头任务的最佳模型,所以为它编写一个包装器通常是有意义的,它可以增加对你案例中“缺失”的支持。 这对于阅读和写作都是如此。