如何使用Apache PDFBox创建表格

39

由于iText存在许可问题,我们计划将PDF生成工具从iText迁移到PDFBox。通过一些努力,我能够编写和定位文本、绘制线条等等。但是创建包含文本的表格是一个挑战,我查阅了文档、示例、Google、Stackoverflow等等,却什么都找不到。 想知道PDFBox是否提供原生支持创建包含嵌入式文本的表格。 最后的办法就是使用这个链接https://github.com/eduardohl/Paginated-PDFBox-Table-Sample


1
就文档创建而言,PDFBox主要相当于iText的低级API。您缺少的是在其之上替代iText高级API的东西。我不知道公开提供类似功能的东西。 - mkl
4
这是另一个链接:https://github.com/dhorions/boxable - Tilman Hausherr
还有一个:https://dev59.com/L2865IYBdhLWcg3wUs_z - Tilman Hausherr
@TilmanHausherr 我怕那些示例只是概念证明,可能在有限的用例中有用,但并不适用于通用情况。PDFBox 有其优点,例如相当多才多艺的内容提取框架和内容呈现功能,但缺乏合适布局API是一个严重的弱点。 - mkl
@Anil “我相信有人会有一个优雅的解决方案” 七年过去了,我们仍然没有那个优雅的解决方案。 - late1
显示剩余4条评论
3个回答

109

由于我在一个项目中也需要表格绘制功能,因此我自己实现了一个小型的“表格绘制器”库,上传到了GitHub

为了生成这样的表格,例如...

enter image description here

...您需要这个代码。 在同一个文件中,您还可以找到该表格的代码:

enter image description here

当前的“特性列表”包括:

  • 在表格级别和单元格级别设置字体和字号
  • 单独定义底部、顶部、左侧和右侧边框宽度的单元格
  • 在行或单元格级别定义背景颜色
  • 在单元格级别定义填充(上、下、左、右)
  • 在表格、行或单元格级别定义边框颜色
  • 指定文本对齐方式(垂直和水平)
  • 单元格合并和行合并
  • 文本换行和行间距

此外,如果需要,添加缺失的内容也不应该太难,比如为顶部、底部、左侧和右侧边框设置不同的边框颜色。


尝试着去解决这个问题...在源代码中是否缺少类AWTColor? - cklab
当然!感谢您的反馈! :) 很明显我没有仔细检查最后一个拉取请求。请再次进行 git 拉取,现在应该可以正常工作了。 - philonous
分页怎么办? - Sandun Chathuranga
1
你的意思是一个跨越多个页面的表格吗?如果是这样,请查看此代码,它可以生成一个跨越三个页面的表格:https://github.com/vandeseer/easytable/blob/master/src/test/java/org/vandeseer/integrationtest/TableOverSeveralPagesTest.java - philonous
@philonous 你有这方面的例子吗?我尝试了一下,但似乎在多个表格中分页不正常。 - Sagar Kadu
显示剩余5条评论

30

感谢Tilman提供的链接。使用boxable API (https://github.com/dhorions/boxable),我成功创建了需要的表格。需要注意的是,我想创建一个变量单元格数的表格,比如第一行有2个单元格,第二行有5个单元格,第三行只有3个单元格,但我轻松地完成了。我遵循了上述链接中的Example1.java示例代码。


1
我在你的回答中找不到你提到的Example1.java文件。请问你能否粘贴你的代码或Example1.java文件? - Darshan Puranik
1
@DarshanPuranik:也许这个test可以帮助你。 - Mohammad Faisal

0

这个示例代码对我来说是可行的。我认为这对你会有所帮助。

public static void creteTablePdf() throws IOException {
    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);

    int pageWidth = (int)page.getTrimBox().getWidth(); //get width of the page
    int pageHeight = (int)page.getTrimBox().getHeight(); //get height of the page

    PDPageContentStream contentStream = new PDPageContentStream(document,page);
    contentStream.setStrokingColor(Color.DARK_GRAY);
    contentStream.setLineWidth(1);

    int initX = 50;
    int initY = pageHeight-50;
    int cellHeight = 20;
    int cellWidth = 100;

    int colCount = 3;
    int rowCount = 3;

    for(int i = 1; i<=rowCount;i++){
        for(int j = 1; j<=colCount;j++){
            if(j == 2){
                contentStream.addRect(initX,initY,cellWidth+30,-cellHeight);

                contentStream.beginText();
                contentStream.newLineAtOffset(initX+30,initY-cellHeight+10);
                contentStream.setFont(PDType1Font.TIMES_ROMAN,10);
                contentStream.showText("Dinuka");
                contentStream.endText();

                initX+=cellWidth+30;
            }else{
                contentStream.addRect(initX,initY,cellWidth,-cellHeight);

                contentStream.beginText();
                contentStream.newLineAtOffset(initX+10,initY-cellHeight+10);
                contentStream.setFont(PDType1Font.TIMES_ROMAN,10);
                contentStream.showText("Dinuka");
                contentStream.endText();

                initX+=cellWidth;
            }
        }
        initX = 50;
        initY -=cellHeight;
    }

    contentStream.stroke();
    contentStream.close();


    document.save("C:\\table.pdf");
    document.close();
    System.out.println("table pdf created");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接