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

Este artículo es el segundo de una serie sobre cómo trabajar con archivos PDF en Python: Leer y dividir páginas Agregar imágenes y marcas de agua (usted está aquí) Insertar, Eliminar...

Este artículo es el segundo de una serie sobre cómo trabajar con archivos PDF en Python:

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 de la historia. Hasta la versión 1.4 de PDF, la visualización de un documento PDF en un visor de PDF adecuado funciona bien. Desafortunadamente, las funciones 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 parte uno, 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 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 bastante útil para sellar o marcar documentos que están destinados a ser leídos por una audiencia específica solamente, o tienen calidad de borrador, o simplemente para agregar un código de barras con fines de identificación.

Adición de 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 simple para hacer las cosas cotidianas con documentos PDF". pdftk ha sido portado a Java y está disponible como un paquete correspondiente para Debian GNU/Linux.

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

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

La herramienta pdftk toma el archivo PDF input.pdf, lo fusiona con background.pdf y envía el resultado al archivo output.pdf. La Figura 1 muestra el resultado de esta acción.

Adding a watermark to an existing PDF{.img-responsive}

Para acciones más complejas, como sellar un documento con diferentes sellos por página, consulte la descripción en PDF Labs [página del proyecto](https://www.pdflabs.com/docs/how-to-add-headers -pies de página-marcas-de-agua-y-sellos-a-pdf/). También mostramos el caso de uso de estampado en este artículo a continuación, aunque nuestro ejemplo usa la biblioteca pdfrw en lugar de pdftk.

Adición de una marca de agua con PyPDF2

La Biblioteca PyPDF proporciona un método llamado mergepage() que acepta otro PDF para usarlo 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 la clase PdfFileReader(). Como segundo paso fusionamos las dos páginas usando el método mergepage(). Finalmente, escribiremos la salida en el archivo de salida. Esto se hace en tres pasos: crear un objeto basado en la clase PdfFileWriter(), agregar la página fusionada a este objeto usando el método addPage() y escribir el nuevo contenido en la página de salida usando write( ) método.

Adding a watermark to an existing PDF using PyPDF{.img-responsive}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# !/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)

Adición de una imagen con PyMuPDF

PyMuPDF son los enlaces de Python para MuPDF, que es un visor ligero de PDF y XPS. 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.

Para esta sección, mostraremos 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 usando 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, 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 imageRectangle y el nombre del archivo de imagen que se insertará. Utilizando el método save(), el PDF modificado se almacena en el disco. La Figura 2 muestra el código de barras después de agregarlo al PDF de ejemplo.

Agregar un código de barras a un PDF existente usando PyMuPDF{.img-responsive}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# !/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)

Adición de 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. Del paquete pdfrw basta con importar las tres clases PdfReader, PdfWriter y 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 en el documento original, continúas creando un objeto PageMerge al que agregas la marca de agua, y que se representa usando el método render(). 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.

Adding a watermark to an existing PDF using pdfrw{.img-responsive}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# !/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 parece compleja se resuelve en minutos. No importa cuál de las bibliotecas dadas elija, funciona muy bien.

La tercera parte de esta serie se centrará exclusivamente en escribir/crear archivos PDF y también incluirá eliminar y volver a combinar páginas individuales en un nuevo documento. dividuales en un nuevo documento.