2011-12-28 200 views
11

我在我的java程序中使用iText来编辑现有的pdf。生成的pdf无法打开,它显示pdf标头签名未找到error.I'm我的输入和输出文件都使用同一名称。如何解决pdf标题签名未找到错误?

private static String INPUTFILE = "/sample.pdf"; 
private static String OUTPUTFILE = "/sample.pdf";  
public static void main(String[] args) 
     throws DocumentException, 
     IOException 
{ 
    Document doc = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(doc,new FileOutputStream(OUTPUTFILE)); 
    doc.open(); 
    PdfReader reader = new PdfReader(INPUTFILE); 
    int n; 
    n = reader.getNumberOfPages(); 
    System.out.println("No. of Pages :" +n); 
    for (int i = 1; i <= n; i++) 
    { 
      if (i == 1)     
      {    
        Rectangle rect = new Rectangle(85,650,800,833); 
        PdfFormField pushbutton = PdfFormField.createPushButton(writer); 
        pushbutton.setWidget(rect, PdfAnnotation.HIGHLIGHT_PUSH); 
        PdfContentByte cb = writer.getDirectContent(); 
        PdfAppearance app = cb.createAppearance(380,201); 
        app.rectangle(62,100,50,-1); 
        app.fill(); 
        pushbutton.setAppearance(PdfAnnotation.APPEARANCE_NORMAL,app); 
        writer.addAnnotation(pushbutton); 
        PdfImportedPage page = writer.getImportedPage(reader, i); 
        Image instance = Image.getInstance(page); 
        doc.add(instance); 
       } 
+1

这将是更好,如果你给我们看你的代码 – 2011-12-28 11:32:10

+0

@ Francisco Puga ....以上是我的代码 – BobDroid 2011-12-28 11:36:05

+1

我认为你应该用这个答案中给出的建议更新你的代码http://stackoverflow.com/a/ 8655157/930271 – 2011-12-29 09:44:45

回答

3

然后尝试在第一次输入的文件重命名为.bak的,并读取.bak的,并写.PDF。这可以提供一个线索,看错误是在阅读还是在写作。

Itext不是一个API,而是几个混合在一起的API。有时很难。我做了:

关闭PdfReaderFileInputStream

关闭DocumentPdfWriter

+0

关闭溪流帮助我!谢谢。 – 2014-02-25 02:45:26

2

您应该使用PdfCopy而不是PdfWriter.getInstance,因为它无法更新PDF对象引用。

此外,您可以使用PdfCopy.addPage方法,而不是将Image添加到文档中,而是接受PdfImportedPage作为参数。

Document doc = new Document(); 
PdfCopy writer = new PdfCopy(doc,new FileOutputStream(OUTPUTFILE)); 
doc.open(); 
PdfReader reader = new PdfReader(INPUTFILE); 
int n = reader.getNumberOfPages(); 
System.out.println("No. of Pages :" +n); 
for (int i = 1; i <= n; i++) { 
     if (i == 1) {    
       // removed code for clarity 
       PdfImportedPage page = writer.getImportedPage(reader, i); 

       writer.addPage(page); 
      } 
} 
4

你可以从一个空的源代码,或无效的PDF文件进行导入,在我的情况pdfCopy不工作,所以这里是我使用的代码。

Document document = new Document(); 
PdfWriter writer = PdfWriter.getInstance(document, OutputStream); 
PdfReader reader = new PdfReader(dato.getBinaryStream()); 

PdfImportedPage page1 = writer.getImportedPage(reader, 1); 
PdfContentByte cb = writer.getDirectContent(); 
cb.addTemplate(page1, 1, 0, 0, 1, 0, 0); 

document.setPageSize(new Rectangle(page1.getWidth(),page1.getHeight())); 

...

这应该工作。

1

我有同样的错误,我只是改变我的PdfReader读取InputStreams读取字符串。

public static void doMerge(List<String> list, OutputStream outputStream) 
    throws DocumentException, IOException { 
Document document = new Document(); 
PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
document.open(); 
PdfContentByte cb = writer.getDirectContent(); 

for (String in : list) { 
    PdfReader reader = new PdfReader(in); 
    for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
     document.newPage(); 
     // import the page from source pdf 
     PdfImportedPage page = writer.getImportedPage(reader, i); 
     // add the page to the destination pdf 
     cb.addTemplate(page, 0, 0); 
    } 
} 

outputStream.flush(); 
document.close(); 
outputStream.close(); 

}

*原先我把这个代码http://www.mindfiresolutions.com/Java-Merging-multiple-PDFs-into-a-single-PDF-using-iText-671.php

2

在我的情况下,PDF样本文件已损坏:所以,它完美的作品。上传新文件它将起作用。

相关问题