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"
);
}
|