-1

次のエラーがあります。特定の形式で、iText を使用して PDF を作成しようとしています。ページの各セクションに表を使用することにしました。これは、必要なフォーマットに表が含まれているためです。さて、私はすでにすべてを行っており、テーブルを作成してdoc.add(table)メソッドで追加しました。これはうまくいきましたが、テーブルを特定の位置に設定する必要がありました。そのため、メソッドを使用することを選択しましたがtable.writeSelectedRows()、これはうまくいきました。

そして、ここにエラーが発生します。これは私のコードです:

table_SectionTwo.addCell(cell_White);
                table_SectionTwo.addCell(cell_White);
                table_SectionTwo.addCell(p);
                table_SectionTwo.addCell(cell_OrderDate);   
                table_SectionTwo.addCell(cell_CustomerOrderDate);
                table_SectionTwo.addCell(cell_OrderNumberSection);                                                              

    float[] columnWidths = new float[] {38f, 105f, 90f};
                    table_SectionTwo.setTotalWidth(columnWidths);
                    table_SectionTwo.setLockedWidth(true);
                    table_SectionTwo.completeRow();                 
                    table_SectionTwo.writeSelectedRows(0, -1, 260f, 770f, super.getPdfWriter().getDirectContent());                     
                    doc.add(table_SectionTwo);

ご覧のとおり、このコードを実行すると、同じテーブルが 2 回追加されます。

問題は、doc.add(table) を削除するときです。これは、を使用して特定の位置に 1 つのテーブルを追加するためだけに行いますtable.writeSelectedRows()。これが私のコードのままです:

table_SectionTwo.writeSelectedRows(0, -1, 260f, 770f, super.getPdfWriter().getDirectContent());                     
//super.addTable(table_SectionTwo);

コメントしdoc.add(table)ました。そして、これは 1 つのテーブルのみを書き込む必要があります。しかし、これはうまくいきません。これを行うと、次がスローされます。

ExceptionConverter: java.io.IOException: The document has no pages.
    at com.itextpdf.text.pdf.PdfPages.writePageTree(PdfPages.java:113)
    at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1217)
    at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:777)
    at com.itextpdf.text.Document.close(Document.java:398)
    at PDFConstructor.CloseDocument(PDFConstructor.java:85)
    at InvoicePDF.CloseDocument(InvoicePDF.java:58)
    at Demo.main(Demo.java:72)

興味深いのは、 doc.add(table)これが機能しないとコメントしたときと、正常に機能したとコメントしたときtable.writeSelectedRows()ですdoc.add(table)。このエラーは、コメントしてdoc.add(table)コメントを外した場合にのみ発生しますtable.writeSelectedRows()

私を助けてください..

4

2 に答える 2

0

質問では十分な情報を提供していませんが、テーブルの幅を定義していないことが問題の原因だと思います。

次のテストを行います。テーブルの全高を尋ねます。iText が 0 を返す場合、テーブルの幅を定義するのを忘れています。0 が返されない場合、明示的に定義したか、ドキュメント オブジェクトのページ メトリックに基づいてテーブルのサイズを計算した document.add(table) を使用したため、iText は幅を認識しています。

他に何か問題がある場合は、より多くの情報を提供する必要があります。

于 2013-01-10T08:09:05.577 に答える
0

あなたの質問から、特定の行をドキュメントに書き込みたいが、指定された位置に書きたいと理解している.これが正しい場合、super.getPdfWriter().getDirectContent())は必要ですか?私はあなたのコードスニペット全体、または同じことを説明するこのコードのデモ版が必要です.

2番目:内部的にitextもPdfPRowを使用してPdfPTableを書き込むためにPdfContentByteを使用します。また、作者(Bruno)によれば、itextはBuilderパターンに基づいて構築されていることを覚えておいてください。前の行が意味をなさない場合はスキップしてください。

必要なすべてのプロパティが設定される前であっても、現在テーブルにコンテンツを追加しています。

table_SectionTwo.addCell(cell_White);
table_SectionTwo.addCell(cell_White);
table_SectionTwo.addCell(p);
table_SectionTwo.addCell(cell_OrderDate);   
table_SectionTwo.addCell(cell_CustomerOrderDate);
table_SectionTwo.addCell(cell_OrderNumberSection);  

こんな感じになります

float[] columnWidths = new float[] {38f, 105f, 90f};
PdfPTable table_SectionTwo= new PdfPTable(clmnWdthTpHdr);
table_SectionTwo.setTotalWidth(500.0f);
table_SectionTwo.setWidthPercentage(100.0f);
table_SectionTwo.setLockedWidth(true);

3.super.getPdfWriter().getDirectContent()を使用しないでください。上記のコードは、ドキュメントを使用していることを示しているため、次のコードスニペットも記述する必要があると思います(このようなもの:lol)

PdfWriter pdfWrtr=null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document doc= new Document(UtilConstant.pageSizePdf,0,0,0,0);
pdfWrtr=PdfWriter.getInstance(doc,baos);

try catch では、pdfWrtr.getDirectContent(); を使用します。代わりは。これらはすべて私のコード分析に基づいています。また、例外からの別のポイント

ExceptionConverter: java.io.IOException: The document has no pages.
    at com.itextpdf.text.pdf.PdfPages.writePageTree(PdfPages.java:113)
...............................
 at InvoicePDF.CloseDocument(InvoicePDF.java:58)
    at Demo.main(Demo.java:72)

ドキュメントに何も追加されていない場合の典型的なエラーです。ステップ 4 で例外がスローされ (そして無視され) (Itext in Action に従って)、ステップ 5 (document.close()) を実行している可能性があります (にもかかわらず)手順 4 の例外です。したがって、上記が明確でない場合は、Demo.java を添付してください。

于 2013-01-12T17:30:32.037 に答える