Эта статья является третьей в серии по работе с PDF-файлами в Python:
- Чтение и разделение страниц
- Добавление изображений и водяных знаков
- Вставка, удаление и изменение порядка страниц ( вы здесь )
Вступление
Эта статья - третья из небольшой серии статей о работе с PDF-файлами в Python. В предыдущих статьях мы познакомились с чтением PDF-документов с помощью Python. До сих пор вы узнали, как управлять существующими PDF-файлами, а также читать и извлекать содержимое - как текст, так и изображения. Кроме того, мы обсудили разделение документов на отдельные страницы, а также добавление водяных знаков и штрих-кодов.
В этой статье мы сделаем еще один шаг и продемонстрируем, как изменить порядок PDF-документа несколькими способами.
- Удаление страниц с помощью pdfrw
- Удаление страниц с помощью PyMuPDF
- Вставка страниц с помощью PyMuPDF
- Разделение четных и нечетных страниц с помощью PyPDF2
Удаление страниц с помощью pdfrw
Удалить отдельные страницы из файла PDF очень просто:
- Читать PDF как входной файл
- Записать выбранные страницы в новый PDF-файл как выходной файл
В следующем примере из PDF-документа удаляются первые две страницы. При
использовании библиотеки pdfrw файл
сначала читается с помощью класса PdfReader()
. За исключением первой
и второй страницы, каждая страница добавляется в выходной файл с помощью
addpage()
, а затем в конечном итоге записывается на диск.
На рисунке 1 показан результат выполнения кода в четырехстраничном PDF-файле.
# !/usr/bin/python
# Remove the first two pages (cover sheet) from the PDF
from pdfrw import PdfReader, PdfWriter
input_file = "example.pdf"
output_file = "example-updated.pdf"
# Define the reader and writer objects
reader_input = PdfReader(input_file)
writer_output = PdfWriter()
# Go through the pages one after the next
for current_page in range(len(reader_input.pages)):
if current_page > 1:
writer_output.addpage(reader_input.pages[current_page])
print("adding page %i" % (current_page + 1))
# Write the modified content to disk
writer_output.write(output_file)
{.ezlazyload .img-responsive}
Удаление страниц с помощью PyMuPDF
Библиотека PyMuPDF включает в себя
довольно много сложных методов, которые упрощают удаление страниц из
файла PDF. Он позволяет указать либо одну страницу (используя метод
deletePage()
), либо диапазон номеров страниц (используя метод
deletePageRange()
), либо список с номерами страниц (используя метод
select()
).
В следующем примере показано, как использовать список для выбора страниц, которые нужно сохранить в исходном документе. Имейте в виду, что страницы, которые не указаны, не будут частью выходного документа. В нашем случае выходной документ содержит только первую, вторую и четвертую страницы.
# !/usr/bin/python
# Recall that PyMuPDF is imported as fitz
import fitz
input_file = "example.pdf"
output_file = "example-rearranged.pdf"
# Define the pages to keep - 1, 2 and 4
file_handle = fitz.open(input_file)
pages_list = [0,1,3]
# Select the pages and save the output
file_handle.select(pages_list)
file_handle.save(output_file)
Вставка страниц с помощью PyMuPDF
Библиотека PyMuPDF также позволяет вставлять страницы. Он предоставляет
методы newPage()
для добавления полностью пустых страниц и
insertPage()
для добавления существующей страницы. В следующем примере
показано, как добавить страницу из другого документа PDF в конец
другого.
# !/usr/bin/python
# Recall that PyMuPDF is imported as fitz
import fitz
original_pdf_path = "example.pdf"
extra_page_path = "extra-page.pdf"
output_file_path = "example-extended.pdf"
original_pdf = fitz.open(original_pdf_path)
extra_page = fitz.open(extra_page_path)
original_pdf.insertPDF(extra_page)
original_pdf.save(output_file_path)
Разделение четных и нечетных страниц с помощью PyPDF2
В следующем примере используется
PyPDF2, и для этого он берет файл,
разделяет его на четные и нечетные страницы, сохраняет четные страницы в
файле even.pdf
и нечетные страницы в odd.pdf
.
Этот сценарий Python начинается с определения двух выходных файлов,
even.pdf
и odd.pdf
, а также их соответствующих объектов записи
pdf_writer_even
и pdf_writer_odd
. Затем в цикле for сценарий
просматривает весь PDF-файл и читает одну страницу за другой. Страницы с
четными номерами страниц добавляются в поток pdf_writer_even
с помощью
addPage()
, а нечетные номера добавляются в поток pdf_writer_odd
. В
конце два потока сохраняются на диск в отдельных файлах, как определено
ранее.
#!/usr/bin/python3
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_document = "example.pdf"
pdf = PdfFileReader(pdf_document)
# Output files for new PDFs
output_filename_even = "even.pdf"
output_filename_odd = "odd.pdf"
pdf_writer_even = PdfFileWriter()
pdf_writer_odd = PdfFileWriter()
# Get reach page and add it to corresponding
# output file based on page number
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)
# Write the data to disk
with open(output_filename_even, "wb") as out:
pdf_writer_even.write(out)
print("created", output_filename_even)
# Write the data to disk
with open(output_filename_odd, "wb") as out:
pdf_writer_odd.write(out)
print("created", output_filename_odd)
Заключение
Переписать и изменить структуру PDF-файла довольно просто с помощью библиотек pdfrw, PyMuPDF и PyPDF2. С помощью всего нескольких строк кода Python вы можете удалять страницы, разделять их и добавлять новый контент.