我正在使用Apache PDFBox Java库来创buildPDF。 有没有办法使用pdfbox创build数据表? 如果没有这样的API来做到这一点,我会需要使用drawLine等手动绘制表格,有关如何去做这个的任何build议?
来源 : 使用PDFBox创建表格
以下方法用指定的表格内容绘制一张表格。 它有点黑客,将工作的小字符串文本。 它不执行文字换行,但您可以了解它是如何完成的。 搏一搏!
/** * @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() - margin - 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; } }
用法:
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" );
我创建了一个使用PDFBox创建表的小API。 它可以在github上找到( https://github.com/dhorions/boxable )。
生成的pdf的样本可以在这里找到http://goo.gl/a7QvRM 。
任何提示或建议,欢迎。
被接受的答案是好的,但它只能与Apache PDFBox 1.x一起使用,对于Apache PDFBox 2.x,您将需要修改一些代码以使其正常工作。
所以这里是相同的代码,但是与Apache PDFBox 2.x兼容:
方法drawTable
:
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 = 20.0f; final float tableWidth = page.getMediaBox().getWidth() - 2.0f * margin; final float tableHeight = rowHeight * (float) rows; final float colWidth = tableWidth / (float) cols; //draw the rows float nexty = y ; for (int i = 0; i <= rows; i++) { contentStream.moveTo(margin, nexty); contentStream.lineTo(margin + tableWidth, nexty); contentStream.stroke(); nexty-= rowHeight; } //draw the columns float nextx = margin; for (int i = 0; i <= cols; i++) { contentStream.moveTo(nextx, y); contentStream.lineTo(nextx, y - tableHeight); contentStream.stroke(); nextx += colWidth; } //now add the text contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12.0f); final float cellMargin = 5.0f; float textx = margin + cellMargin; float texty = y - 15.0f; for (final String[] aContent : content) { for (String text : aContent) { contentStream.beginText(); contentStream.newLineAtOffset(textx, texty); contentStream.showText(text); contentStream.endText(); textx += colWidth; } texty -= rowHeight; textx = margin + cellMargin; } }
Usage更新为使用try-with-resources语句正确关闭资源:
try (PDDocument doc = new PDDocument()) { PDPage page = new PDPage(); doc.addPage(page); try (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.0f, 100.0f, content); } doc.save("test.pdf"); }