В ходе учебного процесса, мне удалость поработать с файлами PDF формата используя Python. Это очень удобно и практично, если у вас есть задачи подобного рода, то вам определенно стоит ознакомится с данной статьей. Какие же задачи можно решать с помощью Python? Как извлекать текст, изображения, разделять на страницы, найти все страницы файла, где имеется нужный нам текст, как вставлять изображения в этот файл, удалять страницы, разделять страницы на четные и нечетные.
Ниже вы можете увидеть код для решение каждой задачи.
1.Добавление изображения с помощью PyMuPDF
#Добавление изображения с помощью PyMuPDF import fitz input_file = "source/Documentation-JS.pdf" output_file = "dist/Documentation-JS-page-image.pdf" barcode_file = "source/image.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)
2. Добавление водяного знака с помощью PyPDF2
#Добавление водяного знака с помощью PyPDF2
# Добавление водяного знака в одностраничный PDF
import PyPDF2
input_file = "source/Documentation-JS.pdf"
output_file = "dist/Documentation-JS-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)
3. Удаление страниц с помощью PyMuPDF
# Удаление страниц с помощью PyMuPDF import fitz input_file = "source/Documentation-JS.pdf" output_file = "dist/Documentation-JS-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)
4. Извлечение изображений из PDF с помощью PyMuPDF
#Извлечение изображений из PDF с помощью PyMuPDF
import fitz
pdf_document = "source/For_image.pdf"
doc = fitz.open(pdf_document)
print("Исходный документ", doc)
print("\nКоличество страниц: %i\n\n------------------\n\n" % doc.pageCount)
print(doc.metadata)
page_count = 0
for i in range(len(doc)):
for img in doc.getPageImageList(i):
xref = img[0]
pix = fitz.Pixmap(doc, xref)
pix1 = fitz.Pixmap(fitz.csRGB, pix)
page_count += 1
pix1.writePNG("images/picture_number_%s_from_page_%s.png" % (page_count, i+1))
print("Image number ", page_count, " writed...")
pix1 = None
5. Извлечение текста с помощью PyMuPDF
#Извлечение текста с помощью PyMuPDF
import fitz
pdf_document = "./source/Documentation-JS.pdf"
doc = fitz.open(pdf_document)
print("Исходный документ: ", doc)
print("\nКоличество страниц: %i\n\n------------------\n\n" % doc.pageCount)
print(doc.metadata)
for current_page in range(len(doc)):
page = doc.loadPage(current_page)
page_text = page.getText("text")
print("Стр. ", current_page+1, "\n\nСодержание;\n")
print(page_text)
6. Извлечение текста с помощью PyPDF2
#Извлечение текста с помощью PyPDF2
from PyPDF2 import PdfFileReader
pdf_document = "source/Documentation-JS.pdf"
with open(pdf_document, "rb") as filehandle:
pdf = PdfFileReader(filehandle)
info = pdf.getDocumentInfo()
pages = pdf.getNumPages()
print("Количество страниц в документе: %i\n\n" % pages)
print("Мета-описание: ", info)
for i in range(pages):
page = pdf.getPage(i)
print("Стр.", i, " мета: ", page, "\n\nСодержание;\n")
print(page.extractText())
7. Найти все страницы, где есть слово JS
#Найти все страницы, где есть слово JS
import fitz
filename = "source/Documentation-JS.pdf"
search_term = "JS"
pdf_document = fitz.open(filename)
for current_page in range(len(pdf_document)):
page = pdf_document.loadPage(current_page)
if page.searchFor(search_term):
print("%s найдено на странице %i" % (search_term, current_page+1))
8. Разделение четных и нечетных страниц с помощью PyPDF2
#Разделение четных и нечетных страниц с помощью PyPDF2
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_document = "source/Documentation-JS.pdf"
pdf = PdfFileReader(pdf_document)
# Выходные файлы для новых PDF-файлов
output_filename_even = "dist/Documentation-JS-even.pdf"
output_filename_odd = "dist/Documentation-JS-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)
9. Разделение PDF‑файлов на страницы с помощью PyPDF2
#Разделение PDF‑файлов на страницы с помощью PyPDF2
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_document = "source/Documentation-JS.pdf"
pdf = PdfFileReader(pdf_document)
for page in range(pdf.getNumPages()):
pdf_writer = PdfFileWriter()
current_page = pdf.getPage(page)
pdf_writer.addPage(current_page)
outputFilename = "dist/Documentation-JS-page-{}.pdf".format(page + 1)
with open(outputFilename, "wb") as out:
pdf_writer.write(out)
print("created", outputFilename)
10. Добавление изображения в многостраничный PDF документ
# Добавление изображения в многостраничный PDF документ
from pdfrw import PdfReader, PdfWriter, PageMerge
input_file = "source/Documentation-JS.pdf"
output_file = "dist/Documentation-JS-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)