

私はiText7でpdfを生成する際に、下記の事が発生しています。

[code]

    com.itextpdf.kernel.PdfException: Pdf indirect object belongs to other PDF document. Copy object to current pdf document.
        at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:195) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:185) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:115) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:187) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:115) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:187) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:115) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfWriter.writeToBody(PdfWriter.java:383) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfWriter.flushObject(PdfWriter.java:289) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfDocument.flushObject(PdfDocument.java:1572) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:159) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:127) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfObjectWrapper.flush(PdfObjectWrapper.java:94) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:495) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:454) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:785) ~[kernel-7.0.2.jar:na]
        at com.itextpdf.layout.Document.close(Document.java:120) ~[layout-7.0.2.jar:na]
        at com.xcz.afbp.thirdparty.service.impl.GeneratePDFService.generatePDF(GeneratePDFService.java:160) ~[classes/:na]
    
[/code]

私が生成するコード  

[code]

    public void generatePDF(CreditQueryData creditQueryData, Map<String, UserCreditContentView> contentViewMap, List<PackageCreditContentView> needRetrievedCreditContentList, File pdfFile, BigDecimal score) throws Exception {
    
        if (!pdfFile.exists()) {
            boolean x = pdfFile.createNewFile();
            if (!x) {
                LOG.error("生成文件出错" + pdfFile.getPath());
                return;
            }
        }
    
        PdfDocument pdf = new PdfDocument(new PdfWriter(new FileOutputStream(pdfFile)));
        Document document = new Document(pdf, PageSize.A4);
        document.setRenderer(new DocumentRenderer(document));
    
        pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new WatermarkingEventHandler());
    
        try {
            //operate code just add tableA tableB tableC...
    
        } catch (Exception e) {
            LOG.info();
        } finally {
            document.close(); //exception throws here
        }
    
    
    }
    
[/code]

iText7での私のスタイルコードは、

[code]

     private PdfFont bfChinese = null;
    
[/code]

サービスコンストラクタで呼び出されます。  
フォントを`static`で設定しようとしましたが、動作しませんでした。 これはplace throw例外です。  

[code]

    private void write(PdfIndirectReference indirectReference) {
        if (document != null && !indirectReference.getDocument().equals(document)) {
            throw new PdfException(PdfException.PdfIndirectObjectBelongsToOtherPdfDocument);
        }
        if (indirectReference.getRefersTo() == null) {
            write(PdfNull.PDF_NULL);
        } else if (indirectReference.getGenNumber() == 0) {
            writeInteger(indirectReference.getObjNumber()).
                    writeBytes(endIndirectWithZeroGenNr);
        } else {
            writeInteger(indirectReference.getObjNumber()).
                    writeSpace().
                    writeInteger(indirectReference.getGenNumber()).
                    writeBytes(endIndirect);
        }
    }
    
[/code]

つまり、2つの異なるドキュメントがあることを意味しますが、別のドキュメントをいつ作成したか分かりません。


CC BY-SA 4.0
2018-11-08T02:39:05.987
50076
2021-10-29T05:55:10.130
2018-11-09T06:04:27.863
23994
30882
question
java pdf
iText7でPDFを生成する際に“Pdf indirect object belongs to other PDF document. Copy object to current pdf document.”の例外が発生する


特定の`PdfFont`インスタンスは、1つのドキュメントに対してのみ使用できます。
`PdfFont`インスタンスを使用すると直ぐに、そのドキュメントにリンクされ、別のドキュメントでこれを使用することはできなくなります

例えば、

[code]

    class ThisGoesWrong {
    
        protected PdfFont font;
    
        public ThisGoesWrong() {
            font = PdfFontFactory.createFont(...);
        }
    
        public void createPdf() {
            ...
            Paragraph p = new Paragraph("test").setFont(font);
            document.add(p);
            ...
        }
    }
    
[/code]

最初の`createPdf（）`を呼び出すときに`ThisGoesWrong`クラスが正しいPDFを作成しますが、2回目に呼び出すときは例外が表示されます。

この問題は以下のように解決できます。  

[code]

    class ThisWorksOK {
    
        public ThisWorksOK() {
        }
    
        public void createPdf() {
            ...
            PdfFont font = PdfFontFactory.createFont(...);
            Paragraph p = new Paragraph("test").setFont(font);
            document.add(p);
            ...
        }
    }
    
[/code]


CC BY-SA 4.0
2018-11-08T02:48:57.200
50077
2018-11-08T02:48:57.200
30882
50076
answer


他のサードパーティーツールを利用して、例えばコンポーネントでPDFなどのドキュメントを作成することが実現できます。

使用するツール：[Spire.PDF for .NET](https://www.e-iceblue.com/Download/download-pdf-
for-net-now.html)

詳細なコード：

[code]

    PdfDocument doc = new PdfDocument();
    PdfPageBase page = newDoc.Pages.Add();
    string message = "Hello world!";
    PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 13f);
    PdfBrush brush = PdfBrushes.Red;
    PointF location = new PointF(20, 20);
    
[/code]

こうすることで無事にPDFドキュメントを作成できます。


CC BY-SA 4.0
2021-10-29T05:52:56.340
83320
2021-10-29T05:55:10.130
2021-10-29T05:55:10.130
3060
48858
50076
answer