Apache PDFBox Javaライブラリ - テーブルを作成するためのAPIはありますか?
質問
Apache PDFBox Javaライブラリを使用してPDFSを作成しています。 pdfboxを使用してデータテーブルを作成する方法はありますか?そのようなAPIがない場合、ドローラインなどを使用してテーブルを手動で描画する必要があります。これについての提案はありますか?
解決
ソース: 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;
}
}
使用するために更新されました リソースで試してください リソースを適切に閉じるための声明:
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");
}
少し前に同じ問題を抱えていたので、私はそれのために小さなライブラリを構築し始めました。
それは使用しています apache pdfbox 2.x ここにあります:https://github.com/vandeseer/easytable
これにより、セルレベル、垂直および水平方向のアライメント、セルにまたがる、単語ラッピング、セル内の画像の設定、背景色、パディングなど、かなりのカスタマイズが可能になります。
数ページにわたってテーブルを描画することも可能です。
たとえば、このようなテーブルを作成できます。
この例のコードは見つかります ここ - 同じフォルダーの他の例も同様です。