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 *