2011-12-28 3 views
11

Sto usando iText nel mio programma java per modificare un pdf esistente.Il pdf generato non può aprire e mostra l'errore di firma non trovato di intestazione pdf. Sto usando sia il mio file di input che di output con lo stesso nome.Come risolvere l'errore di firma di intestazione pdf non trovato?

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

Sarà meglio se ci mostri il tuo codice –

+0

@ Francisco Puga .... Sopra c'è il mio codice – BobDroid

+1

Penso che dovresti aggiornare il tuo codice con i suggerimenti forniti in questa risposta http://stackoverflow.com/a/ 8655157/930271 –

risposta

3

Poi prova a prima rinominare il file di input per .bak, e la lettura del bak, e scrivere il .pdf. Questo potrebbe dare un indizio se l'errore è con la lettura o la scrittura.

Itext non è una singola API, ma diverse, mescolate tra loro. Abbastanza difficile a volte. Ho fatto:

Chiudere entrambi i PdfReader e FileInputStream.

Chiudere entrambi Document e PdfWriter.

+0

Chiudere gli stream mi aiuta! Grazie. –

2

È necessario utilizzare PdfCopy anziché PdfWriter.getInstance, poiché non riesce ad aggiornare i riferimenti agli oggetti PDF in caso contrario.

Inoltre, anziché aggiungere uno Image al documento, è possibile utilizzare il metodo PdfCopy.addPage, che accetta come parametro un 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

Si può importare da una fonte vuota, o un file PDF non valido, nel mio caso pdfCopy non funzionano, ecco il codice che ho usato.

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())); 

...

questo dovrebbe funzionare.

1

Ho avuto lo stesso errore e ho appena cambiato il mio PdfReader dalla lettura di InputStreams per leggere le stringhe. Così, funziona perfettamente con:

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(); 

}

* Inizialmente ho preso questo codice da http://www.mindfiresolutions.com/Java-Merging-multiple-PDFs-into-a-single-PDF-using-iText-671.php

2

Nel mio caso file di esempio PDF è stato danneggiato. carica il nuovo file funzionerà.