使用PDFBox的表/报告格式

时间:2014-02-17 10:46:24

标签: java string pdf pdfbox

我遇到了PDF Box的格式问题。我的目标是以表格样式打印PDF作为报告。内容格式类似于

Name Code Description Value

我检索我的数据库结果集并拥有一个Java对象列表。我提取所需的信息,并将其格式化为字符串列表,如下所示。我循环通过对象,构造一个字符串并添加到arrayList。我的想法是创建一个完全相同长度/样式的字符串列表,以强制格式化为PDF格式。

Code Reference

for(MyObject obj: dbresults){
   //format as below and add to list
}
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
formatter.format("%-25.25s", "This is some text with more than 25 characters.");

formatter.format("%-25.25s", "Some text with less.");

formatter.format("%-25.25s", "Some other text.");

System.out.println(formatter.toString());

输出:

|This is some text with mo|Some text with less.     |Some other text.         |

我打印出这个列表多次到屏幕:)并通过System.out或logger格式完全按照我的预期,甚至块。

然而,当我发送到PDFBox打印到文件时,格式被“损坏”,并且“表格格式”不受尊重。我作为x,y co-ords传递100和700。

Code Reference

    private void printMultipleLines(
    PDPageContentStream contentStream,
    List<String> 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;

用于打印的样本列表:这是在打印到屏幕时使用java格式化程序类的方式,所有看起来都不错,但是当我打印到PDFBox时,格式不受尊重

Tom Thumb         555-ddd   Good     23
Tom Thumb         666-ggg   Good     45
CHARLES DICKENS   777-jjj   Good     32
CHARLES DICKENS   666-hhh   Bad      11
W Yeats           888-hhh   Ok       12
R Whitely         444-999   Terrible 44 

PDF输出看起来像

Tom Thumb         555-ddd   Good     23
Tom Thumb         666-ggg   Good     45
CHARLES DICKENS       777-jjj   Good     32
CHARLES DICKENS       666-hhh   Bad      11
W Yeats           888-hhh   Ok       12
R Whitely          444-999   Terrible 44 

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:5)

你在PDF中使用等宽字体(如Courier)吗? 它可以解释你在控制台中获得了良好的输出,在PDF中获得了不好的输出

问候