2016-05-17 16 views
1

文書をPdfAConformanceLevel.PDF_A_1B準拠にエクスポートしたいが、私がdocument.closeを実行すると、以下のエラーが表示され、pdfが使用できない。pdf/pdfをiTextライブラリを使用して変換する

私は以下を使用iTextのバージョン:

 <artifactId>itextpdf</artifactId> 
     <version>5.5.9</version> 

     <artifactId>itext-pdfa</artifactId> 
     <version>5.5.9</version> 

スタックトレース:

com.itextpdf.text.pdf.PdfAConformanceException: Real number is out of range. 
at com.itextpdf.text.pdf.internal.PdfA1Checker.checkPdfObject(PdfA1Checker.java:259) 
at com.itextpdf.text.pdf.internal.PdfAChecker.checkPdfAConformance(PdfAChecker.java:208) 
at com.itextpdf.text.pdf.internal.PdfAConformanceImp.checkPdfIsoConformance(PdfAConformanceImp.java:71) 
at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3480) 
at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3476) 
at com.itextpdf.text.pdf.PdfObject.toPdf(PdfObject.java:174) 
at com.itextpdf.text.pdf.PdfArray.toPdf(PdfArray.java:175) 
at com.itextpdf.text.pdf.PdfDictionary.toPdf(PdfDictionary.java:149) 
at com.itextpdf.text.pdf.PdfStream.superToPdf(PdfStream.java:278) 
at com.itextpdf.text.pdf.PRStream.toPdf(PRStream.java:239) 
at com.itextpdf.text.pdf.PdfIndirectObject.writeTo(PdfIndirectObject.java:158) 
at com.itextpdf.text.pdf.PdfWriter$PdfBody.write(PdfWriter.java:420) 
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:398) 
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:377) 
at com.itextpdf.text.pdf.PdfWriter.addToBody(PdfWriter.java:872) 
at com.itextpdf.text.pdf.PdfReaderInstance.writeAllVisited(PdfReaderInstance.java:161) 
at com.itextpdf.text.pdf.PdfReaderInstance.writeAllPages(PdfReaderInstance.java:177) 
at com.itextpdf.text.pdf.PdfWriter.addSharedObjectsToBody(PdfWriter.java:1380) 
at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1264) 
at com.itextpdf.text.pdf.PdfAWriter.close(PdfAWriter.java:337) 
at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:889) 
at com.itextpdf.text.Document.close(Document.java:416) 
at si.telekom.erender.ERenderImpl.mergeContentOfItems(ERenderImpl.java:2911) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:279) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.sun.xml.ws.api.server.MethodUtil.invoke(MethodUtil.java:83) 
at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:250) 
at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:149) 
at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:88) 
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1136) 
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050) 
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019) 
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877) 
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:419) 
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:868) 
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:422) 
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.invokeAsync(ServletAdapter.java:225) 
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:161) 
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:197) 
at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:81) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 

私は次のコードでPDFを生成しています:

public byte[] mergeContentOfItems(List<MergeItem> items) throws ErenderException { 
    MessageContext mc = wsCtx.getMessageContext(); 
    HttpServletRequest req = (HttpServletRequest) mc.get(MessageContext.SERVLET_REQUEST); 
    getLogger().info("Webservice method 'mergeContentOfItems' called from IP:" + req.getRemoteAddr()); 
    if (items.size() < 1) { 
     String errDescription = "No barcodes specified!"; 
     throw new ErenderException(errDescription, new ErenderExceptionBean("201", errDescription), 
       new Throwable(errDescription)); 
    } 

    com.itextpdf.text.Document document = new com.itextpdf.text.Document(); 
    ByteArrayOutputStream baOs = new ByteArrayOutputStream(); 

    PdfWriter writer = null; 
    List<PdfReader> readers = new ArrayList<PdfReader>(); 
    int totalPages = 0; 

    try { 
     // Create a writer for the outputstream 
     writer = PdfAWriter.getInstance(document, baOs, PdfAConformanceLevel.PDF_A_1B); 
     writer.setPdfVersion(PdfWriter.PDF_VERSION_1_4); 
     writer.createXmpMetadata(); 

     //writer = PdfWriter.getInstance(document, baOs); 

     document.open(); 

     ICC_Profile icc = ICC_Profile 
       .getInstance(Thread.currentThread().getContextClassLoader().getResourceAsStream("srgb.profile")); 
     writer.setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc); 
     PdfContentByte cb = writer.getDirectContent(); // Holds the PDF 

     for (int i = 0; i < items.size(); i++) { 
      String pdfFileName = null; 
      File urlTempFile = null; 
      if (items.get(i).getBarcode() != null) { 
       Template tmpl = TemplatesSynchronizer.getTemplateByBarcode(items.get(i).getBarcode()); 
       String fileName = tmpl.getName(); 
       pdfFileName = fileName.substring(0, fileName.indexOf(".")) + ".pdf"; 
       getLogger().info("\tworking on:" + items.get(i) + " fileName:" + pdfFileName); 
       if (!new File(pdfFileName).exists()) { 
        String msg = String.format("Datoteka %s ne obstaja", pdfFileName); 
        throw new ErenderException("Error", new ErenderExceptionBean("109", msg, new Exception(msg))); 
       } 

      } else if (items.get(i).getUrl() != null) { 
       urlTempFile = File.createTempFile("myTemp", "pdf"); 
       FileUtils.copyURLToFile(new URL(items.get(i).getUrl()), urlTempFile); 
      } 

      if (pdfFileName != null || urlTempFile != null) { 
       PdfReader pdfReader = null; 
       if (pdfFileName != null) 
        pdfReader = new PdfReader(pdfFileName); 
       else if (urlTempFile != null) 
        pdfReader = new PdfReader(urlTempFile.getAbsolutePath()); 

       if (pdfReader != null) { 
        // Create Readers for the pdfs. 
        readers.add(pdfReader); 
        totalPages += pdfReader.getNumberOfPages(); 

        int pageOfCurrentReaderPDF = 0; 
        while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) { 
         document.newPage(); 
         pageOfCurrentReaderPDF++; 
         PdfImportedPage page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF); 
         document.setPageSize(pdfReader.getPageSizeWithRotation(pageOfCurrentReaderPDF)); 
         document.newPage(); 
         cb.addTemplate(page, 0, 0); 
        } 
       } 
       if (urlTempFile != null) 
        urlTempFile.delete(); 
      } 
     } 

    } catch (Throwable ex) { 
     StringWriter errorStringWriter = new StringWriter(); 
     PrintWriter pw = new PrintWriter(errorStringWriter); 
     ex.printStackTrace(pw); 
     Logger.getLogger(this.getClass()).error(errorStringWriter.getBuffer().toString()); 
     throw new ErenderException("Error", new ErenderExceptionBean("109", "Napaka v merge metodi.",ex), ex); 

    } finally { 

     if (document != null && document.isOpen()) 
      try { 
       document.close(); 
      } catch (Exception ex) { 
       StringWriter errorStringWriter = new StringWriter(); 
       PrintWriter pw = new PrintWriter(errorStringWriter); 
       ex.printStackTrace(pw); 
       Logger.getLogger(this.getClass()).error(errorStringWriter.getBuffer().toString()); 


       getLogger().error("Unable to close document.\n" + errorStringWriter); 
      } 

     if (writer != null && writer.isCloseStream()) { 
      try { 
       writer.flush(); 
       writer.close(); 
      } catch (Exception ex) { 
       getLogger().error("Unable to flush or close writer"); 
      } 
     } 

     try { 
      baOs.flush(); 
      baOs.close(); 
     } catch (Exception ex) { 
      getLogger().error("Unable to close baOs in mergeContent method."); 
     } 
    } 
    getLogger().info("Webservice method 'mergeContent' called from IP:" + req.getRemoteAddr() + " ended. " + totalPages 
      + " merged."); 
    return baOs.toByteArray(); 

} 

私は、上のエラーを得ることはありませんので、他のファイルは入力ファイルに固有のようです - ここにエラーを再現する1つのファイルがあります:この http://filebin.ca/2hR2xO1SNlzh/09062009073008005.pdf

+0

読みやすくするために、スタックトレースをコードブロックに配置できますか? –

+0

入力が特定のものであり、他のファイルにはこれがないことを忘れています。 –

+1

OKこれらの情報を追加しました。 – zhivko

答えて

3

まず:3210私はこの入力PDFファイルを変換しようとしていますiTextのは、PDF/A文書に通常 PDF文書を変換しません。私たちにはiTextを使ってこれを行う顧客がいますが、そのコードはあなたのものよりはるかに精巧です。

iTextが普通のPDF文書をPDF/Aに変換しない理由は明らかです。通常のPDFは、PDF/Aに必要な機能をすべて備えていない可能性があります。フォントが埋め込まれていないPDFがあるかもしれません。その場合、誰かが適切なフォントプログラムを提供する必要があります。 iTextにはフォントプログラムが付属していないので、ソフトウェアを使用してください。 iTextがこれを提供しなければなりません。

コードでは、最終結果がPDF/Aに準拠しない可能性のある問題を確認せずにコンテンツストリームをコピーするだけです。結果として生じるPDFには非常に注意する必要があります。彼らはクレームのファイルがPDF/Aであることを示す青いバーを表示しますが、それはがバリデーターを渡すときにをPDFとして検証することを意味しません。

問題が発生しました。あなたは普通のPDFをPDF/A-1に変換したいと思う。 PDF/A-1は、2001年のPDF 1.4に基づいています。つまり、の後に導入された新機能のいずれも使用できません。PDF 1.4では、オブジェクト番号に関して制限がありました。 PDFのオブジェクト番号は32,767を超えてはいけません。この制限はPDF 1.5のPDFから削除されました。

私が推測する問題は、PDF 1.4で許可されている以上のオブジェクトでPDF 1.4を作成しようとしたことが原因であると考えられます。二つの理由が考えられます:

  1. あなたの元のPDFは、PDF 1.5以降で、PDFの
  2. あなたの操作は、オブジェクトの最大利用可能数よりも多くを必要とします。

これはPDF/A-1の代わりにPDF/A-2を生成することで修正できますが、すぐに他の制限が当てられますクレームのファイルを作成してPDFにすることはできません。 PdfAWriterは、間違っていることをしようとすると例外がスローされますが、もっと微妙なPDF/A要件が不足しているという保証はありません。

関連する問題