Добавление водяного знака с помощью PyPDF2
В пакете PyPDF2 есть метод mergepage(), который использует другой PDF в качестве водяного знака или штампа. Сам PDF файл, который мы хотим, чтобы программа использовала в качестве водяного знака кладем в папку source (в моем случае это mshe-logo-512x512.pdf). Начнем с чтения первой страницы исходного PDF документа и водяного знака. Для чтения файла мы используем класс PdfFileReader(). На втором шаге эти две страницы объединяются с помощью метода mergepage(), после чего результат записывается в выходной файл. Эти три этапа — создание объекта на основе класса PdfFileWriter(), добавление объединенной страницы к этому объекту с помощью метода addPage() и запись нового контента на выходную страницу с помощью метода write(). При этом, получившийся новый PDF файл с водяным знаком появится в папке dist. Сам код:
# Добавление водяного знака в одностраничный PDF import PyPDF2 input_file = "source/ YourFile.pdf " output_file = "dist/ YourFile -page-drafted.pdf" watermark_file = "source/mshe-logo-512x512.pdf" with open(input_file, "rb") as filehandle_input: # читать содержимое исходного файла pdf = PyPDF2.PdfFileReader(filehandle_input) with open(watermark_file, "rb") as filehandle_watermark: # читать содержание водяного знака watermark = PyPDF2.PdfFileReader(filehandle_watermark) # получить первую страницу оригинального PDF first_page = pdf.getPage(0) # получить первую страницу водяного знака PDF first_page_watermark = watermark.getPage(0) # объединить две страницы first_page.mergePage(first_page_watermark) # создать объект записи PDF для выходного файла pdf_writer = PyPDF2.PdfFileWriter() # добавить страницу pdf_writer.addPage(first_page) with open(output_file, "wb") as filehandle_output: # записать файл с водяными знаками в новый файл pdf_writer.write(filehandle_output)
Результат:
Добавление изображения с помощью PyMuPDF
В данном коде, я добавил в мой PDF файл изображение, которое предварительно положил в папку source (в моем случае это image.jpg). Сам код:
import fitz input_file = "source/ YourFile.pdf " output_file = "dist/ YourFile -page-image.pdf" barcode_file = "source/YourImage.jpg" # определить позицию (верхний правый угол) image_rectangle = fitz.Rect(450, 170, 550, 270) # retrieve the first page of the PDF file_handle = fitz.open(input_file) first_page = file_handle[0] # добавить изображение first_page.insertImage(image_rectangle, filename=barcode_file) file_handle.save(output_file)
Положение изображения определяется как rectangle (прямоугольник) методом fitz.Rect(), который требует двух пар координат — левый верхний угол (x1,y1) и правый нижний угол (x2,y2) изображения. В PyMuPDF левому верхнему углу страницы соответствуют координаты (0,0). После открытия входного файла и извлечения из него первой страницы с помощью метода insertImage() добавляется наше изображение. Этот метод требует двух параметров — позиционирование с использованием imageRectangle и имя файла изображения для вставки. С помощью метода save() измененный PDF файл сохраняется на диске. Результат:
Добавление штампов с pdfrw
pdfrw — это библиотека Python и утилита, которая читает и записывает PDF файлы. И перед тем как выполнять данное задание, эту библиотеку необходимо будет установить. После этого, мы из данного пакета импортируем три класса — PdfReader PdfWriter и PageMerge. Устанавливаем соответственно объекты чтения/записи, для доступа как к содержимому PDF, так и к нашему изображению. Для каждой страницы в исходном документе вы продолжаем создавать объекты PageMerge, к которому добавляем водяной знак и который отображается всё это с помощью метода render(). Сам код:
from pdfrw import PdfReader, PdfWriter, PageMerge input_file = "source/ YourFile.pdf " output_file = "dist/ YourFile-pages-image.pdf" watermark_file = "source/mshe-logo-512x512.pdf " # определяем объекты чтения и записи reader_input = PdfReader(input_file) writer_output = PdfWriter() watermark_input = PdfReader(watermark_file) watermark = watermark_input.pages[0] # просматривать страницы одну за другой for current_page in range(len(reader_input.pages)): merger = PageMerge(reader_input.pages[current_page]) merger.add(watermark).render() # записать измененный контент на диск writer_output.write(output_file, reader_input)
Результат:
Удаление страниц с помощью PyMuPDF
Библиотека PyMuPDF включает в себя довольно много сложных методов, которые упрощают удаление страниц из файла PDF. Он позволяет вам указать либо одну страницу (метод deletePage()), либо диапазон номеров страниц (метод deletePageRange()), либо список с номерами страниц (метод select()). В следующем примере будет показано, как использовать список для выбора страниц, которые следует сохранить из исходного документа. Имейте в виду, что страницы, которые не указаны, не будут частью выходного документа. В нашем случае выходной документ содержит только первую, вторую и четвертую страницы:
import fitz input_file = "source/YourFile.pdf " output_file = "dist/YourFile -rearranged.pdf" # Определите страницы для сохранения - 1, 2 и 4 file_handle = fitz.open(input_file) pages_list = [0,1,3] # Выберите страницы и сохраните вывод file_handle.select(pages_list) file_handle.save(output_file)
Результат:
Разделение четных и нечетных страниц с помощью PyPDF2
Следующий пример использует PyPDF2 и разделяет файл на четные и нечетные страницы, сохраняя четные страницы в файле Documentation-Python-even.pdf и нечетные страницы в Documentation-Python-odd.pdf. Этот скрипт Python начинается с определения двух выходных файлов, Documentation-Python-even.pdf и Documentation-Python-odd.pdf, а также соответствующие им объекты для записи pdf_writer_even и pdf_writer_odd. Затем в цикле for скрипт просматривает весь файл PDF и читает одну страницу за другой. Страницы с четными номерами страниц добавляются в поток pdf_writer_even с помощью addPage(), а нечетные номера добавляются в поток pdf_writer_odd. В конце два потока сохраняются на диск в отдельных файлах, как определено ранее. Сам код:
from PyPDF2 import PdfFileReader, PdfFileWriter pdf_document = "source/ YourFile.pdf " pdf = PdfFileReader(pdf_document) # Выходные файлы для новых PDF-файлов output_filename_even = "dist/ YourFile -even.pdf" output_filename_odd = "dist/ YourFile -odd.pdf" pdf_writer_even = PdfFileWriter() pdf_writer_odd = PdfFileWriter() # Получить досягаемую страницу и добавить ее в соответствующую # выходной файл на основе номера страницы for page in range(pdf.getNumPages()): current_page = pdf.getPage(page) if page % 2 == 0: pdf_writer_odd.addPage(current_page) else: pdf_writer_even.addPage(current_page) # Записать данные на диск with open(output_filename_even, "wb") as out: pdf_writer_even.write(out) print("created", output_filename_even) # Записать данные на диск with open(output_filename_odd, "wb") as out: pdf_writer_odd.write(out) print("created", output_filename_odd)