Создайте новый PDF-файл в цикле с помощью iText Java

Я хочу создать новый PDF-файл для каждой итерации цикла, поэтому я написал следующий код в java:

PdfWriter writer;
PdfDocument pdf;
Document document;

int i=0;
while(condition){
    writer = new PdfWriter("test_"+Integer.toString(i)+".pdf");
    pdf = new PdfDocument(writer);
    document = new Document(pdf);

    //content code here

    document.close()
    i++;
}

я получаю следующее исключение в строке команды document.close():

Исключение в потоке «основной» com.itextpdf.kernel.PdfException: косвенный объект Pdf принадлежит другому документу PDF. Скопировать объект в текущий документ PDF. в com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:184) в com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:174) в com.itextpdf.kernel.pdf.PdfOutputStream.write (PdfOutputStream.java:104) в com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:176) в com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:104) в com.itextpdf. kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:176) в com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:104) в com.itextpdf.kernel.pdf.PdfWriter.writeToBody(PdfWriter.java: 335) в com.itextpdf.kernel.pdf.PdfWriter.flushObject(PdfWriter.java:243) в com.itextpdf.kernel.pdf.PdfDocument.flushObject(PdfDocument.java:1446) в com.itextpdf.kernel.pdf.PdfObject .flush(PdfObject.java:155) в com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:128) в com.itextpdf.kernel.pdf.PdfObjectWrapper.flush(PdfObjectWrapper.java:96) ) в com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:489) в com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:448) в com.itextpdf.kernel.pdf.PdfDocument. close(PdfDocument.java:739) в com.itextpdf.layout.Document.close(Document.java:120) в gr.moh.Pdf.main(Pdf.java:224)

я много пробовал, но я не могу найти, почему я получаю сообщение об ошибке. Если я делаю это без цикла, это работает. Любая помощь?

PS: я использую itext 7


person mike_x_    schedule 23.11.2016    source источник
comment
Похоже, вы используете некоторые объекты PDF в нескольких прогонах цикла в вашем //content code here, то есть для нескольких целевых PDF-файлов. Это может привести к исключениям, подобным вашему.   -  person mkl    schedule 23.11.2016
comment
спасибо! я использую стиль над циклом, чтобы назначить шрифты абзацам. Я добавил их в цикл, и он работает!   -  person mike_x_    schedule 23.11.2016


Ответы (1)


У меня был приведенный ниже код вне цикла, и он должен быть в цикле...

PdfFont normalFont = PdfFontFactory.createFont(fontDirectory.getAbsolutePath()+"\\arial.ttf", "Identity-H", true);
                normal.setFont(normalFont).setFontSize(14);

                Style red = new Style();
                PdfFont redFont = PdfFontFactory.createFont(fontDirectory.getAbsolutePath()+"\\arial.ttf", "Identity-H", true);
                red.setFont(redFont).setFontSize(14).setFontColor(Color.RED);

                Style big = new Style();
                PdfFont bigFont = PdfFontFactory.createFont(fontDirectory.getAbsolutePath()+"\\arial.ttf", "Identity-H", true);
                big.setFont(bigFont).setFontSize(18).setBold();
person mike_x_    schedule 23.11.2016