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

T

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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad