3

次のコードのように、さまざまなテーブルの内容を除いて、ドキュメントを生成しています。セル内のコンテンツの量に関係なく、このテーブルのサイズが 1 ページを超えないようにする必要があります。それを行う方法はありますか?

com.itextpdf.text.Phrase をインポートします。
com.itextpdf.text.Document をインポートします。
com.itextpdf.text.DocumentException をインポートします。
com.itextpdf.text.PageSize をインポートします。
インポートcom.itextpdf.text.pdf.PdfPCell;
com.itextpdf.text.pdf.PdfPTable をインポートします。
java.awt.Desktop をインポートします。
java.io.File をインポートします。
import java.io.FileNotFoundException;
java.io.FileOutputStream をインポートします。
import java.io.IOException;

public void createTemplate() は DocumentException、FileNotFoundException、IOException をスローします{ String TARGET = System.getProperty("user.home")+"\temp.pdf";
Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(TARGET)); document.open();

PdfPTable table = new PdfPTable(7); for (int i = 0; i < 105; i++) { Phrase p = new Phrase("some text"); PdfPCell cell = new PdfPCell(); cell.addElement(p); table.addCell(cell); } table.setTotalWidth(PageSize.A4.getWidth()-10); table.setLockedWidth(true); PdfContentByte canvas = writer.getDirectContent(); PdfTemplate template = canvas.createTemplate(table.getTotalWidth(),table.getTotalHeight()); table.writeSelectedRows(0, -1, 0, PageSize.A4.getHeight(), template); Image img = Image.getInstance(template); img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight()); img.setAbsolutePosition(0, PageSize.A4.getHeight()); document.add(img); document.close(); Desktop desktop = Desktop.getDesktop(); File file = new File(TARGET); desktop.open(file); }

編集:@Bruno Lowagie。テンプレートが画像にラップされたヒントは私にはちょうどいいように聞こえ、それに応じてコードを変更しましたが、今は空の PDF しか得られません。私は何か間違ったことをしていますか、それともこれは全体として間違ったアプローチですか?

4

1 に答える 1

14

テーブルをページに合わせたい場合は、ページ サイズを考える前にテーブルを作成し、TableHeightの例で行ったようにテーブルの高さを確認する必要があります。getTotalHeight()テーブルの幅を定義しない限り、このメソッドは 0 を返すことに注意してください。これは次のように行うことができます。

    table.setTotalWidth(width);
    table.setLockedWidth(true);

Documentサイズを指定して を作成できるようになりました。メソッドを使用Rectangle(0, 0, width + margin * 2, getTotalHeight() + margin * 2)してテーブルを追加すると、テーブルはドキュメントに正確に収まるはずですwriteSelectedRows()

カスタム ページ サイズが必要ない場合PdfTemplateは、テーブルのサイズで を作成し、このテンプレート オブジェクトにテーブルを追加する必要があります。次に、テンプレート オブジェクトを でラップし、Imageを使用scaleToFit()してテーブルのサイズを小さくします。

public static void main(String[] args) throws DocumentException, FileNotFoundException, IOException {
    String TARGET = "temp.pdf";
    Document document = new Document(PageSize.A4);
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(TARGET));
    document.open();


    PdfPTable table = new PdfPTable(7);         

    for (int i = 0; i < 700; i++) {
        Phrase p = new Phrase("some text");
        PdfPCell cell = new PdfPCell();
        cell.addElement(p);
        table.addCell(cell);            
    }

    table.setTotalWidth(PageSize.A4.getWidth());
    table.setLockedWidth(true);
    PdfContentByte canvas = writer.getDirectContent();
    PdfTemplate template = canvas.createTemplate(table.getTotalWidth(), table.getTotalHeight());
    table.writeSelectedRows(0, -1, 0, table.getTotalHeight(), template);
    Image img = Image.getInstance(template);
    img.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight());
    img.setAbsolutePosition(0, (PageSize.A4.getHeight() - table.getTotalHeight()) / 2);
    document.add(img);
    document.close();
}
于 2013-02-20T14:10:23.613 に答える