2011-12-28 26 views
11

Estoy usando iText en mi programa java para editar un PDF existente. El pdf generado no se pudo abrir y muestra el error de firma de encabezado del pdf. No estoy usando mi archivo de entrada y salida con el mismo nombre.¿Cómo resolver el error de la firma del encabezado del pdf no encontrado?

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

Será mejor si nos muestra su código –

+0

@ Francisco Puga .... Arriba está mi código – BobDroid

+1

Creo que debería actualizar su código con las sugerencias dadas en esta respuesta http://stackoverflow.com/a/ 8655157/930271 –

Respuesta

3

A continuación, intente cambiar el nombre en primer lugar el archivo de entrada a .bak, y leyendo el .bak, y escribir el .pdf. Eso podría dar una pista si el error está en leer o escribir.

Itext no es una sola API, sino varias, mezcladas. Muy difícil a veces. Lo hice:

Cierre tanto PdfReader como FileInputStream.

Cierre ambos Document y PdfWriter.

+0

¡Cerrar las transmisiones, ayúdeme! Gracias. –

2

Debe usar PdfCopy en lugar de PdfWriter.getInstance, ya que de lo contrario no actualiza las referencias del objeto PDF.

Además, en lugar de agregar un Image al documento, puede utilizar el método PdfCopy.addPage, que acepta un PdfImportedPage como parámetro.

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

Se le puede importar desde una fuente de vacío, o un archivo PDF válido, en mi caso pdfCopy no funcionan, por lo que aquí es el código que he usado.

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

...

esto debería funcionar.

1

Tuve el mismo error y acabo de cambiar mi PdfReader de leer InputStreams para leer cadenas. Por lo tanto, funciona perfectamente 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(); 

}

* Originalmente tomaron el código de http://www.mindfiresolutions.com/Java-Merging-multiple-PDFs-into-a-single-PDF-using-iText-671.php

2

en mi archivo PDF muestra de casos fue corrompido. cargar nuevo archivo, funcionará.

Cuestiones relacionadas