Trabajar con archivos PDF en Python: agregar im谩genes y marcas de agua

    Introducci贸n

    Hoy en d铆a, un mundo sin el formato de documento port谩til (PDF) parece impensable. Se ha convertido en uno de los formatos de datos m谩s utilizados. Hasta la versi贸n 1.4 de PDF, la visualizaci贸n de un documento PDF en un visor de PDF correspondiente funciona bien. Desafortunadamente, las caracter铆sticas de las revisiones de PDF m谩s recientes, como los formularios, son dif铆ciles de implementar y a煤n requieren m谩s trabajo para que sean completamente funcionales en las herramientas. Usando varias bibliotecas de Python, puede crear su propia aplicaci贸n de una manera f谩cil comparable.

    Este art铆culo es la segunda parte de una peque帽a serie sobre archivos PDF con Python. En la primera parte ya le dimos una introducci贸n a la lectura de documentos PDF usando Python, y comenzamos con un resumen de las diversas bibliotecas de Python. Sigui贸 una introducci贸n que mostraba c贸mo manipular archivos PDF existentes y c贸mo leer y extraer el contenido, tanto el texto como las im谩genes. Adem谩s, le mostramos c贸mo dividir documentos en sus p谩ginas individuales.

    En este art铆culo, aprender谩 c贸mo agregar im谩genes a su PDF en forma de marcas de agua, sellos y c贸digos de barras. Por ejemplo, esto es muy 煤til para sellar o marcar documentos que est谩n destinados a ser le铆dos por una audiencia espec铆fica, solo, o que tienen calidad de borrador, o simplemente para agregar un c贸digo de barras con fines de identificaci贸n.

    Agregar una marca de agua a trav茅s de la l铆nea de comandos con pdftk

    Para agregar una marca de agua a un PDF existente en una l铆nea de comandos de Unix / Linux, podemos usar pdftk. El nombre abrevia “PDF Toolkit” y se describe a s铆 mismo como “una herramienta sencilla para hacer las cosas cotidianas con documentos PDF”. pdftk se ha portado a Java y est谩 disponible como una paquete para Debian GNU / Linux.

    Para que esto funcione, necesita tener una imagen de fondo disponible que venga con la palabra “BORRADOR” en una capa transparente, que puede aplicar a un PDF de una sola p谩gina existente de la siguiente manera:

    $ pdftk input.pdf background background.pdf output output.pdf
    

    los pdftk la herramienta toma el archivo PDF input.pdf, lo fusiona con background.pdfy env铆a el resultado al archivo output.pdf. La figura 1 muestra el resultado de esta acci贸n.

    Para acciones m谩s complejas, como sellar un documento con diferentes sellos por p谩gina, eche un vistazo a la descripci贸n en PDF Labs p谩gina del proyecto. Tambi茅n mostramos el caso de uso de estampado en este art铆culo a continuaci贸n, aunque nuestro ejemplo usa la biblioteca pdfrw en vez de pdftk.

    Agregar una marca de agua con PyPDF2

    los Biblioteca PyPDF proporciona un m茅todo llamado mergepage() que acepta otro PDF para usar como marca de agua o sello.

    En el siguiente ejemplo, comenzamos leyendo la primera p谩gina del documento PDF original y la marca de agua. Para leer el archivo usamos el PdfFileReader() clase. Como segundo paso, fusionamos las dos p谩ginas utilizando el mergepage() m茅todo. Finalmente, escribiremos la salida en el archivo de salida. Esto se hace en tres pasos: crear un objeto basado en el PdfFileWriter() clase, agregando la p谩gina combinada a este objeto usando la addPage() m茅todo, y escribir el nuevo contenido en la p谩gina de salida utilizando el write() m茅todo.

    # !/usr/bin/python
    # Adding a watermark to a single-page PDF
    
    import PyPDF2
    
    input_file = "example.pdf"
    output_file = "example-drafted.pdf"
    watermark_file = "draft.pdf"
    
    with open(input_file, "rb") as filehandle_input:
        # read content of the original file
        pdf = PyPDF2.PdfFileReader(filehandle_input)
        
        with open(watermark_file, "rb") as filehandle_watermark:
            # read content of the watermark
            watermark = PyPDF2.PdfFileReader(filehandle_watermark)
            
            # get first page of the original PDF
            first_page = pdf.getPage(0)
            
            # get first page of the watermark PDF
            first_page_watermark = watermark.getPage(0)
            
            # merge the two pages
            first_page.mergePage(first_page_watermark)
            
            # create a pdf writer object for the output file
            pdf_writer = PyPDF2.PdfFileWriter()
            
            # add page
            pdf_writer.addPage(first_page)
            
            with open(output_file, "wb") as filehandle_output:
                # write the watermarked file to the new file
                pdf_writer.write(filehandle_output)
    

    Agregar una imagen con PyMuPDF

    PyMuPDF son los enlaces de Python para MuPDF, que es un visor de PDF y XPS ligero. En su secuencia de comandos de Python, el m贸dulo que debe importarse se llama fitz, y este nombre se remonta al nombre anterior de PyMuPDF.

    En esta secci贸n vamos a mostrar c贸mo agregar una imagen usando un c贸digo de barras como ejemplo, ya que esta es una tarea bastante com煤n. Aunque se pueden aplicar los mismos pasos para agregar cualquier tipo de imagen a un PDF.

    Para decorar un documento PDF con un c贸digo de barras, simplemente agregamos una imagen como otra capa de PDF en la posici贸n deseada. En cuanto a los formatos de imagen, PyMuPDF acepta PNG o JPEG, pero no SVG.

    La posici贸n de la imagen se define como un rect谩ngulo utilizando el m茅todo fitz.Rect() que requiere dos pares de coordenadas – (x1, y1) y (x2, y2). PyMuPDF interpreta la esquina superior izquierda de la p谩gina como (0,0).

    Habiendo abierto el archivo de entrada y extra铆do la primera p谩gina de 茅l, la imagen que contiene el c贸digo de barras se agrega usando el m茅todo insertImage(). Este m茅todo requiere dos par谩metros: la posici贸n entregada a trav茅s de imageRectangley el nombre del archivo de imagen que se va a insertar. Utilizando la save() m茅todo el PDF modificado se almacena en el disco. La Figura 2 muestra el c贸digo de barras despu茅s de que se agreg贸 al PDF de ejemplo.

    # !/usr/bin/python
    
    import fitz
    
    input_file = "example.pdf"
    output_file = "example-with-barcode.pdf"
    barcode_file = "barcode.png"
    
    # define the position (upper-right corner)
    image_rectangle = fitz.Rect(450,20,550,120)
    
    # retrieve the first page of the PDF
    file_handle = fitz.open(input_file)
    first_page = file_handle[0]
    
    # add the image
    first_page.insertImage(image_rectangle, fileName=barcode_file)
    
    file_handle.save(output_file)
    

    Agregar sellos con pdfrw

    pdfrw es un analizador de PDF puro basado en Python para leer y escribir documentos PDF. Reproduce fielmente formatos vectoriales sin rasterizaci贸n. Para Debian GNU / Linux, el repositorio de paquetes contiene versiones para Python 2 y 3.

    El siguiente ejemplo demostrar谩 c贸mo agregar un c贸digo de barras o una marca de agua a un PDF existente que contiene varias p谩ginas. Desde el pdfrw paquete es suficiente que importe las tres clases PdfReader, PdfWritery PageMerge. A continuaci贸n, establece los objetos de lectura y escritura correspondientes para acceder al contenido tanto del PDF como de la marca de agua. Para cada p谩gina del documento original, contin煤a creando un PageMerge objeto al que agrega la marca de agua, y que se representa con el render() m茅todo. Finalmente, escribe las p谩ginas modificadas en el archivo de salida. La Figura 3 muestra el documento modificado junto al c贸digo que hizo posible la adici贸n.

    # !/usr/bin/python
    # Adding a watermark to a multi-page PDF
    
    from pdfrw import PdfReader, PdfWriter, PageMerge
    
    input_file = "example.pdf"
    output_file = "example-drafted.pdf"
    watermark_file = "barcode.pdf"
    
    # define the reader and writer objects
    reader_input = PdfReader(input_file)
    writer_output = PdfWriter()
    watermark_input = PdfReader(watermark_file)
    watermark = watermark_input.pages[0]
    
    # go through the pages one after the next
    for current_page in range(len(reader_input.pages)):
        merger = PageMerge(reader_input.pages[current_page])
        merger.add(watermark).render()
    
    # write the modified content to disk
    writer_output.write(output_file, reader_input)
    

    Conclusi贸n

    Agregar im谩genes, marcas de agua o sellos a un archivo PDF es bastante simple. Con unas pocas l铆neas de c贸digo, esta tarea que suena compleja se resuelve en minutos. No importa cu谩l de las bibliotecas que elija, funciona muy bien.

    La tercera parte de esta serie se centrar谩 exclusivamente en escribir / crear archivos PDF, y tambi茅n incluir谩 la eliminaci贸n y la combinaci贸n de p谩ginas individuales en un nuevo documento.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *