Es hay alguna manera de editar un PDF a partir de Java?

Tengo un documento PDF que contiene marcadores de posición para el texto que necesito para ser reemplazado con Java, pero todas las bibliotecas de las que vi PDF creado a partir de cero y pequeña funcionalidad de edición.

Existe de todos modos puedo editar un archivo PDF, o es imposible?

InformationsquelleAutor Ammar | 2010-11-09

5 Comentarios

  1. 12

    Usted puede hacerlo con iText. He probado con el siguiente código. Se añade un fragmento de texto y un círculo rojo sobre cada página de un PDF existente.

    /* requires itextpdf-5.1.2.jar or similar */
    import java.io.*;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.*;
    
    public class AddContentToPDF {
    
        public static void main(String[] args) throws IOException, DocumentException {
    
            /* example inspired from "iText in action" (2006), chapter 2 */
    
            PdfReader reader = new PdfReader("C:/temp/Bubi.pdf"); //input PDF
            PdfStamper stamper = new PdfStamper(reader,
              new FileOutputStream("C:/temp/Bubi_modified.pdf")); //output PDF
            BaseFont bf = BaseFont.createFont(
                    BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); //set font
    
            //loop on pages (1-based)
            for (int i=1; i<=reader.getNumberOfPages(); i++){
    
                //get object for writing over the existing content;
                //you can also use getUnderContent for writing in the bottom layer
                PdfContentByte over = stamper.getOverContent(i);
    
                //write text
                over.beginText();
                over.setFontAndSize(bf, 10);    //set font and size
                over.setTextMatrix(107, 740);   //set x,y position (0,0 is at the bottom left)
                over.showText("I can write at page " + i);  //set text
                over.endText();
    
                //draw a red circle
                over.setRGBColorStroke(0xFF, 0x00, 0x00);
                over.setLineWidth(5f);
                over.ellipse(250, 450, 350, 550);
                over.stroke();
            }
    
            stamper.close();
    
        }
    }
    • Este ejemplo se superpone a la página con el nuevo texto y la elipse. Hay una forma de modificar el texto en el lugar? ¿Hay manera de buscar, por ejemplo un token, y reemplace con mi texto en lugar de la superposición de ella?
    • Buen punto, me gustaría saber también!
    • error……. Señal Fatal 7 (SIGBUS), código 2, la culpa addr 0xa290903f en tid 25590 (om.pdfgenerator)
    • Me han fallado a la edición de texto en el pdf existente. Texto extraído es un montón de valores similares a: «(>) Tj». Tutorial link: developers.itextpdf.com/examples/…
    • respecto a ese «Tutorial link»: seguramente has visto el enlace en la parte superior de la JavaDoc allí. Todo apunta a la este MODO de respuesta en la que Bruno en particular a los estados que si sus archivos Pdf son relativamente simples se puede usar ese código pero que en la vida real, los archivos Pdf no son tan simples… Que se han error de edición de texto en el pdf existente, por lo tanto, solo se espera! Si sólo quieres editar muy específicas documentos, crear una propia pregunta de que y suministro de ejemplos. No esperes una solución genérica, aunque!
  2. 0

    He modificado el código que se encuentra un poco y se fue a trabajar como sigue

    public class Principal {
    public static final String SRC = "C:/tmp/244558.pdf";
    public static final String DEST = "C:/tmp/244558-2.pdf";
    public static void main(String[] args) throws IOException, DocumentException {
    File file = new File(DEST);
    file.getParentFile().mkdirs();
    new Principal().manipulatePdf(SRC, DEST);
    }
    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfDictionary dict = reader.getPageN(1);
    PdfObject object = dict.getDirectObject(PdfName.CONTENTS);
    PdfArray refs = null;
    if (dict.get(PdfName.CONTENTS).isArray()) {
    refs = dict.getAsArray(PdfName.CONTENTS);
    } else if (dict.get(PdfName.CONTENTS).isIndirect()) {
    refs = new PdfArray(dict.get(PdfName.CONTENTS));
    }
    for (int i = 0; i < refs.getArrayList().size(); i++) {
    PRStream stream = (PRStream) refs.getDirectObject(i);
    byte[] data = PdfReader.getStreamBytes(stream);
    stream.setData(new String(data).replace("NULA", "Nulo").getBytes());
    }
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
    reader.close();
    }

    }

    • Que tipo de reemplazo de texto funciona sólo bajo circunstancias muy específicas (las fuentes en el archivo pdf debe utilizar un ASCII-como la codificación y no debe ser incorporado como incompleta subconjuntos sólo; además, el generador no debe de haber aplicado el kerning o una técnica similar que divide las líneas de texto en distintos fragmentos). Y también sólo cambiar el contenido de la página de contenido de los arroyos.

Dejar respuesta

Please enter your comment!
Please enter your name here