Creating tables with PDFBox


Apache PDFBox is a us

Creating tables with PDFBox

eful Java library for working with PDF documents. It allows you to create new PDF documents and extract data from existing documents.

However, the library doesn't provide an API for creating tables within PDF documents. So I wrote my own method which uses basic operations like drawLine to draw the table cells and drawString to fill in the content. The code is shown below. Note, that this code could be improved to handle longer strings of text properly by wrapping text within cells, which it doesn't do at present.

/**
  * @param page
  * @param contentStream
  * @param y the y-coordinate of the first row
  * @param margin the padding on left and right of table
  * @param content a 2d array containing the table data
  * @throws IOException
  */
public static void drawTable(PDPage page, PDPageContentStream contentStream,
                             float y, float margin,
                             String[][] content) throws IOException {
     final int rows = content.length;
     final int cols = content[ 0 ].length;
     final float rowHeight = 20f;
     final float tableWidth = page.findMediaBox().getWidth()-( 2 *margin);
     final float tableHeight = rowHeight * rows;
     final float colWidth = tableWidth/( float )cols;
     final float cellMargin=5f;
 
     //draw the rows
     float nexty = y ;
     for ( int i = 0 ; i <= rows; i++) {
         contentStream.drawLine(margin,nexty,margin+tableWidth,nexty);
         nexty-= rowHeight;
     }
 
     //draw the columns
     float nextx = margin;
     for ( int i = 0 ; i <= cols; i++) {
         contentStream.drawLine(nextx,y,nextx,y-tableHeight);
         nextx += colWidth;
     }
 
     //now add the text
     contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12 );
 
     float textx = margin+cellMargin;
     float texty = y- 15 ;
     for ( int i = 0 ; i < content.length; i++){
         for ( int j = 0 ; j < content[i].length; j++){
             String text = content[i][j];
             contentStream.beginText();
             contentStream.moveTextPositionByAmount(textx,texty);
             contentStream.drawString(text);
             contentStream.endText();
             textx += colWidth;
         }
         texty-=rowHeight;
         textx = margin+cellMargin;
     }
}
 
public static void main(String[] args){
     PDDocument doc = new PDDocument();
     PDPage page = new PDPage();
     doc.addPage( page );
 
     PDPageContentStream contentStream =
                     new PDPageContentStream(doc, page);
 
     String[][] content = {{ "a" , "b" , "1" },
                           { "c" , "d" , "2" },
                           { "e" , "f" , "3" },
                           { "g" , "h" , "4" },
                           { "i" , "j" , "5" }} ;
 
     drawTable(page, contentStream, 700 , 100 , content);
     contentStream.close();
     doc.save( "test.pdf" );
}    

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值