iText 7.1.6 + Документ был закрыт. Невозможно выполнить действие - PullRequest
1 голос
/ 13 июня 2019

Я использую Itext 7.1.6 для создания PDF.Когда я пытаюсь запустить, я получаю эту ошибку документ был закрыт.Невозможно выполнить действие.

Я проверил решения в stackoverflow для этого, но они говорят, что это связано со шрифтами.Я изменял шрифты, создавая экземпляр каждый раз, когда использую его, но даже тогда у меня возникает одна и та же проблема.

Я не могу понять, как решить эту проблему.Может кто-нибудь, пожалуйста, помогите мне исправить это?

Найдите приведенный ниже код и исключение

    Document doc = null;
PdfPage sourcePage = null;
try (   InputStream resource = new FileInputStream(new File(Paths.get("Output").toAbsolutePath()+"/source.pdf"));
       PdfReader pdfReader = new PdfReader(resource);
       PdfDocument pdfDocument = new PdfDocument(pdfReader)    ) {
   PdfDocumentContentParser contentParser = new PdfDocumentContentParser(pdfDocument);
   MarginFinder strategy = contentParser.processContent(1, new MarginFinder());

   sourcePage = pdfDocument.getPage(1);
   sourcePage.setCropBox(strategy.getBoundingBox());
   sourcePage.setMediaBox(strategy.getBoundingBox());
}


@SuppressWarnings("resource")
PdfWriter writer = new PdfWriter(new FileOutputStream(new File(Paths.get("Output").toAbsolutePath()+"/final.pdf"))).setSmartMode(true);
PdfDocument pdfDoc = new PdfDocument(writer);
pdfDoc.setDefaultPageSize(PageSize.A3.rotate());
String fonts[] = {Paths.get("fonts").toAbsolutePath() + "/TREBUC.TTF", Paths.get("fonts").toAbsolutePath() + "/TREBUCBD.TTF", Paths.get("fonts").toAbsolutePath() + "/TREBUCBI.TTF",Paths.get("fonts").toAbsolutePath() + "/TREBUCIT.TTF"};
FontProvider fontProvider = new FontProvider();
Map<String, PdfFont> pdfFontMap = new HashMap<String, PdfFont>();
for (String font : fonts) {
   FontProgram fontProgram = FontProgramFactory.createFont(font);
   if (font.endsWith("TREBUC.TTF")) {
       pdfFontMap.put("NORMAL", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
   } else if (font.endsWith("TREBUCBD.TTF")) {
       pdfFontMap.put("BOLD", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
   } else if (font.endsWith("TREBUCBI.TTF")) {
       pdfFontMap.put("BOLD_ITALIC", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
   } else if (font.endsWith("TREBUCIT.TTF")) {
       pdfFontMap.put("ITALIC", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
   }

   fontProvider.addFont(fontProgram);
}

TestVisualSummaryNew testVisualSummaryNew = new TestVisualSummaryNew();
NormalPageHeader headerHandler = testVisualSummaryNew.new NormalPageHeader(Paths.get("images").toAbsolutePath() + "\\logo.png", pdfFontMap);
pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
PageEndEvent pageEndEvent = testVisualSummaryNew.new PageEndEvent(Paths.get("images").toAbsolutePath() + "\\FooterLineExternal.png" ,pdfFontMap);
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, pageEndEvent);

doc = new Document(pdfDoc);
doc.setTopMargin(55);
PdfFormXObject xobject = sourcePage.copyAsFormXObject(pdfDoc);
Rectangle xobjectBoundaryBox = xobject.getBBox().toRectangle();
xobject.getPdfObject().put(PdfName.Matrix, new PdfArray(new float[] {1, 0, 0, 1, -xobjectBoundaryBox.getLeft(), -xobjectBoundaryBox.getBottom()}));
Image image = new Image(xobject);
image.setAutoScale(true);
doc.add(image);
System.out.println("Converted to PDF Succesfully >>> source.pdf");

Исключение

com.itextpdf.kernel.PdfException: документ был закрыт.Невозможно выполнить действие.по адресу com.itextpdf.kernel.pdf.PdfDocument.checkClosingStatus (PdfDocument.java:2041) по адресу com.itextpdf.kernel.pdf.PdfDocument.getWriter (PdfDocument.java:706) по адресу com.itextpdf.kernel.pdfReferenceWirect(PdfIndirectReference.java:270) по адресу com.itextpdf.kernel.pdf.PdfObject.copyTo (PdfObject.java:318) по адресу com.itextpdf.kernel.pdf.PdfPage.copyAsFormXObject (PdfPage.java:4396 * 101 *

*

1 Ответ

2 голосов
/ 13 июня 2019

Как уже указывалось в комментарии к вашему предыдущему вопросу

Вы, кажется, уже закрыли исходный документ в то время.Тогда его нельзя закрывать, чтобы можно было копировать с него.

Таким образом, не закрывайте его раньше, ни явно, ни создавая его в try-with-resources:

Document doc = null;
PdfDocument pdfDocument = null; //!!!
PdfPage sourcePage = null;
try (   InputStream resource = new FileInputStream(new File(Paths.get("Output").toAbsolutePath()+"/test.pdf"));    ) {  //!!!
   PdfReader pdfReader = new PdfReader(resource); //!!!
   pdfDocument = new PdfDocument(pdfReader); //!!!
   PdfDocumentContentParser contentParser = new PdfDocumentContentParser(pdfDocument);
   MarginFinder strategy = contentParser.processContent(1, new MarginFinder());

   sourcePage = pdfDocument.getPage(1);
   sourcePage.setCropBox(strategy.getBoundingBox());
   sourcePage.setMediaBox(strategy.getBoundingBox());
   //pdfDocument.close(); //!!!
}


try {
   @SuppressWarnings("resource")
   PdfWriter writer = new PdfWriter(new FileOutputStream(new File(Paths.get("Output").toAbsolutePath()+"/final.pdf"))).setSmartMode(true);
   PdfDocument pdfDoc = new PdfDocument(writer);
   pdfDoc.setDefaultPageSize(PageSize.A3.rotate());
   String fonts[] = {Paths.get("fonts").toAbsolutePath() + "/TREBUC.TTF", Paths.get("fonts").toAbsolutePath() + "/TREBUCBD.TTF", Paths.get("fonts").toAbsolutePath() + "/TREBUCBI.TTF",Paths.get("fonts").toAbsolutePath() + "/TREBUCIT.TTF"};
   FontProvider fontProvider = new FontProvider();
   Map<String, PdfFont> pdfFontMap = new HashMap<String, PdfFont>();
   for (String font : fonts) {
       FontProgram fontProgram = FontProgramFactory.createFont(font);
       if (font.endsWith("TREBUC.TTF")) {
           pdfFontMap.put("NORMAL", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
       } else if (font.endsWith("TREBUCBD.TTF")) {
           pdfFontMap.put("BOLD", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
       } else if (font.endsWith("TREBUCBI.TTF")) {
           pdfFontMap.put("BOLD_ITALIC", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
       } else if (font.endsWith("TREBUCIT.TTF")) {
           pdfFontMap.put("ITALIC", PdfFontFactory.createFont(fontProgram, PdfEncodings.WINANSI, true));
       }

       fontProvider.addFont(fontProgram);
   }

   TestVisualSummaryNew testVisualSummaryNew = new TestVisualSummaryNew();
   NormalPageHeader headerHandler = testVisualSummaryNew.new NormalPageHeader(Paths.get("images").toAbsolutePath() + "\\logo.png", pdfFontMap);
   pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
   PageEndEvent pageEndEvent = testVisualSummaryNew.new PageEndEvent(Paths.get("images").toAbsolutePath() + "\\FooterLineExternal.png" ,pdfFontMap);
   pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, pageEndEvent);

   doc = new Document(pdfDoc);
   doc.setTopMargin(55);
   PdfFormXObject xobject = sourcePage.copyAsFormXObject(pdfDoc);
   Rectangle xobjectBoundaryBox = xobject.getBBox().toRectangle();
   xobject.getPdfObject().put(PdfName.Matrix, new PdfArray(new float[] {1, 0, 0, 1, -xobjectBoundaryBox.getLeft(), -xobjectBoundaryBox.getBottom()}));
   Image image = new Image(xobject);
   image.setAutoScale(true);
   doc.add(image);
   pdfDoc.close();
   doc.close();
   System.out.println("Converted to PDF Succesfully >>> convertedSvg_" + uuid + ".pdf");
} catch (Exception e) {
   e.printStackTrace();
   System.out.println("Error Occured while converting to PDF = " + e.getMessage());
}

pdfDocument.close();  //!!!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...