Автор оригинала: 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 Labs project . Мы также показываем пример использования штамповки в этой статье ниже, хотя в нашем примере используется библиотека pdf rw
вместо pdftk
.
Добавление водяного знака с помощью PyPDF2
Библиотека pyPdf предоставляет метод под названием merge page ()
, который принимает другой PDF-файл для использования в качестве водяного знака или штампа.
В приведенном ниже примере мы начинаем с чтения первой страницы исходного PDF-документа и водяного знака. Для чтения файла мы используем класс Pdf File Reader ()
. В качестве второго шага мы объединяем две страницы с помощью метода merge page ()
. Наконец, мы запишем выходные данные в выходной файл. Это делается в три этапа – создание объекта на основе класса PdfFileWriter ()
, добавление объединенной страницы к этому объекту с помощью метода addPage()
и запись нового содержимого на выходную страницу с помощью метода write ()
.
# !/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-файла.
# !/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 показан измененный документ рядом с кодом, который сделал возможным добавление.
# !/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-файлов, а также будет включать как удаление, так и повторное объединение отдельных страниц в новый документ.