Рубрики
Без рубрики

Работа с PDF-файлами на Python: Добавление изображений и водяных знаков

Автор оригинала: Frank Hofmann.

Эта статья является второй в серии работ по работе с PDF файлами на Python:

Вступление

Сегодня мир без Портативного формата документов (PDF) кажется немыслимым. Он стал одним из наиболее часто используемых форматов данных. До версии PDF 1.4 отображение PDF-документа в соответствующем средстве просмотра PDF работает нормально. К сожалению, функции из новых редакций PDF, такие как формы, сложно реализовать, и все еще требуется дальнейшая работа, чтобы быть полностью функциональными в инструментах. Используя различные библиотеки Python, вы можете создать свое собственное приложение сопоставимым простым способом.

Эта статья-вторая часть небольшой серии статей о PDF-файлах с Python. В первой части мы уже познакомили вас с чтением PDF-документов с помощью Python и начали с краткого описания различных библиотек Python. Затем последовало введение, показывающее, как манипулировать существующими PDF – файлами, а также как читать и извлекать содержимое-как текст, так и изображения. Кроме того, мы показали вам, как разделить документы на отдельные страницы.

В этой статье вы узнаете, как добавлять изображения в PDF-файл в виде водяных знаков, штампов и штрих-кодов. Например, это очень полезно для того, чтобы проштамповать или пометить документы, которые предназначены только для чтения определенной аудиторией, или имеют черновое качество, или просто добавить штрих-код для целей идентификации.

Добавление водяного знака через командную строку с помощью pdftk

Чтобы добавить водяной знак к существующему PDF-файлу в командной строке Unix/Linux, мы можем использовать pdftk . Это название сокращенно означает “PDF Toolkit” и описывает себя как “простой инструмент для выполнения повседневных задач с PDF-документами”. pdftk был портирован на Java и стал доступен в качестве соответствующего пакета для Debian GNU/Linux.

Для того чтобы это сработало, вам нужно иметь фоновое изображение, которое поставляется со словом “ЧЕРНОВИК” на прозрачном слое, которое вы можете применить к существующему одностраничному PDF-файлу следующим образом:

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

Инструмент pdftk принимает PDF-файл input.pdf , объединяет его с background.pdf и выводит результат в файл output.pdf . На рис. 1 показан результат этого действия.

Добавление водяного знака к существующему PDF-файлу

Для более сложных действий, таких как штамповка документа разными штампами на странице, ознакомьтесь с описанием на странице PDF Labs project . Мы также показываем пример использования штамповки в этой статье ниже, хотя в нашем примере используется библиотека pdf rw вместо pdftk .

Добавление водяного знака с помощью PyPDF2

Библиотека pyPdf предоставляет метод под названием merge page () , который принимает другой PDF-файл для использования в качестве водяного знака или штампа.

В приведенном ниже примере мы начинаем с чтения первой страницы исходного PDF-документа и водяного знака. Для чтения файла мы используем класс Pdf File Reader () . В качестве второго шага мы объединяем две страницы с помощью метода merge page () . Наконец, мы запишем выходные данные в выходной файл. Это делается в три этапа – создание объекта на основе класса PdfFileWriter () , добавление объединенной страницы к этому объекту с помощью метода addPage() и запись нового содержимого на выходную страницу с помощью метода write () .

Добавление водяного знака к существующему PDF-файлу с помощью Pdf-файла
# !/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)

Добавление изображения с помощью PyMuPDF

PyMuPDF – это привязки Python для MuPDF, который представляет собой легкий просмотрщик PDF и XPS. В вашем скрипте Python модуль , который необходимо импортировать, называется fitz , и это имя восходит к предыдущему имени PyMuPDF.

В этом разделе мы покажем, как добавить изображение с помощью штрих-кода в качестве примера, поскольку это довольно распространенная задача. Хотя те же самые шаги можно применить и к добавлению любого вида изображения в PDF.

Чтобы украсить PDF-документ штрих-кодом, мы просто добавляем изображение в качестве еще одного слоя PDF в нужном месте. Что касается графических форматов, то PyMuPDF принимает PNG или JPEG, но не SVG.

Положение изображения определяется как прямоугольник с помощью метода fitz.Rect() для этого требуются две пары координат – (x1,y1) и (x2,y2). PyMuPDF интерпретирует верхний левый угол страницы как (0,0).

Открыв входной файл и извлек из него первую страницу, изображение, содержащее штрих-код, добавляется с помощью метода insertImage() . Этот метод требует двух параметров – позиции , передаваемой через image Rectangle , и имени вставляемого файла изображения. С помощью метода save() измененный PDF-файл сохраняется на диске. На рис. 2 показан штрих-код после его добавления в пример PDF-файла.

Добавление штрих-кода в существующий PDF-файл с помощью Primopdf
# !/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)

Добавление штампов с помощью pdfrw

pdf rw -это чистый PDF-парсер на основе Python для чтения и записи PDF-документов. Он точно воспроизводит векторные форматы без растеризации. Для Debian GNU/Linux репозиторий пакетов содержит выпуски как для Python 2, так и для Python 3.

В следующем примере будет показано, как добавить штрих-код или водяной знак в существующий PDF-файл, содержащий несколько страниц. Из пакета pdf rw достаточно импортировать три класса PdfReader , PdfWriter и Page Merge . Затем вы устанавливаете соответствующие объекты reader и writer для доступа к содержимому как PDF-файла, так и водяного знака. Для каждой страницы исходного документа вы продолжаете создавать объект Page Merge , к которому добавляете водяной знак и который визуализируется с помощью метода render () . Наконец, вы записываете измененные страницы в выходной файл. На рис.3 показан измененный документ рядом с кодом, который сделал возможным добавление.

Добавление водяного знака к существующему PDF-файлу с помощью pdf rw
# !/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)

Вывод

Добавление изображений, водяных знаков или штампов в PDF-файл довольно просто. С помощью нескольких строк кода эта сложная задача решается в считанные минуты. Независимо от того, какую из данных библиотек вы выберете, она работает очень хорошо.

Третья часть этой серии будет посвящена исключительно написанию/созданию PDF-файлов, а также будет включать как удаление, так и повторное объединение отдельных страниц в новый документ.