2014-09-10 65 views
0

我正在創建一個Web應用程序,它將使用iText填充PDF表單。要創建PDF表單,我首先使用Microsoft Word創建模板,保存模板,然後在Adobe Acrobat Xi Pro中打開該文件,添加我的表單域並將其保存爲PDF。問題是PDF不帶拖車保存,所以當我執行此:iText錯誤:java.io.IOException:未找到預告片

PdfReader reader = new PdfReader(templateName); 

它拋出一個異常「java.io.IOException異常:拖車未找到」。我知道如果它有一個預告片,我可以閱讀PDF,因爲我試過閱讀其他PDF。所以看起來問題在於Acrobat沒有爲我的PDF添加預告片。即使我嘗試在Acrobat中從頭開始創建PDF表單,它也不會與預告片一起保存。

有沒有其他人遇到這個問題? Acrobat中是否有一些設置可以添加預告片?有沒有辦法讓iText在沒有預告片的情況下閱讀它?

==== ==== UPDATE

我必須有一箇舊版本的iText的,因爲當我下載了最新版本我能讀我的PDF文件。然而,在閱讀文件並加蓋後,我得到了關閉壓模的異常情況。代碼如下所示:

PdfReader reader = new PdfReader(templateName); 
FileOutputStream os = new FileOutputStream(outputPath); 
PdfStamper stamper = new PdfStamper(reader, os); 
AcroFields acroFields = stamper.getAcroFields(); 

List<String> fields = getFieldNames(getContextCd()); 
for (String field : fields) { 
    acroFields.setField (field, StringUtil.checkEmpty(request.getParameter(field))); 
} 

stamper.setFormFlattening(true); 
stamper.close(); 

我得到的錯誤是:

java.lang.AbstractMethodError:javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava /朗/字符串; Z)V 在com.itextpdf.xmp.impl.XMPMetaParser.createDocumentBuilderFactory(XMPMetaParser.java:423) 在com.itextpdf.xmp.impl.XMPMetaParser。(XMPMetaParser.java:71) 在com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory .java:167) at com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer(XMPMetaFactory.java:153) at com.itextpdf.text.pdf.PdfStamperIm p.close(PdfStamperImp.java:337) 在com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:208)

我加入到我的類路徑中的唯一的jar文件是itextpdf-5.5.2。罐。我需要任何其他的罐子嗎?

+1

向我們展示PDF。 Adobe Acrobat總是添加一個預告片。也許還有另外一個問題。另外:你正在使用哪個版本的iText?我記得過去我們對預告片的位置非常嚴格:我們實際上實現了規格,並且在某些時候我們不太嚴格,因爲並非所有的PDF都遵守規格(但是由Acrobat Professional創建的規格總是這樣)。 – 2014-09-10 13:23:53

+0

如何顯示PDF?我很高興分享它,我只是不知道如何。 – Mike 2014-09-10 13:36:24

+0

將它放在Dropbox等文件共享服務上並共享鏈接。屏幕截圖不會,我們需要PDF。 – 2014-09-10 13:42:18

回答

0

我的解決方案將工作... 假設1:PDF缺少預告片,它被放置在資源/ xxx和構建這之後移動到類新/ XXX 假設2:你嘗試讀取從PDF classpath並嘗試從這個pdf文件路徑生成一個PdfReader對象。

如果上述假設是正確的,下面是推理的解決方案: 轉到您的pom文件或構建您擁有的配置文件,並更改設置以排除.pdf文件在構建過程中被濾除。我們希望pdf能夠從資源/ xxx移動到classess/xxx,而無需通過構建活動進行任何操作。類似如下:

<build> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <excludes> 
       **<exclude>**/*.pdf</exclude>** 
      </excludes> 
      </resource> 
     </resources> 

說明需要的?好。 當資源從資源/ xxx移動到classess/xxx時,無論它們是什麼類型的文件,它們都被構建過程解釋。在爲PDF執行此操作時,預計會生成預告片和EOF標記。如果沒有,構建工具會向PDF內容添加額外字符,以通過任何試圖使用此PDF的代碼來報告問題。 如果我們跳過構建活動中的PDF過濾,即使拖車丟失,也可以使用相同的pdf。

希望這會有所幫助!