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