![Удалить определенные страницы PDF в зависимости от содержания](https://rvso.com/image/97238/%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%20PDF%20%D0%B2%20%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%BE%D1%82%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D1%8F.png)
У меня более 50 000 документов PDF, которые необходимо распределить по учетным записям клиентов. Однако каждый PDF-файл содержит страницы, которые я не хочу, чтобы клиент видел (внутренние материалы компании), поэтому я хотел бы иметь возможность удалять определенные страницы на основе их содержимого (на странице отображается надпись «только для офисного использования») и сохранять PDF-файл как новый файл.
Я хорошо разбираюсь в написании скриптов, мне просто нужно знать, какое программное обеспечение способно выполнить такую задачу.
решение1
Существует ряд библиотек для работы с PDF-файлами, включая неподдерживаемуюpyPdfи его вилкаPyPDF2. Вы можете обрабатывать файл постранично, извлекать текст и копировать страницы, текст которых подходит.
Я запустил следующее, используя Python3.6 и PyPDF2==1.26.0:
#!/usr/bin/env python3
import re
import sys
from PyPDF2 import PdfFileWriter, PdfFileReader
pdf_in = PdfFileReader(sys.stdin.buffer)
pdf_out = PdfFileWriter()
for p in [pdf_in.getPage(i) for i in range(0, pdf_in.getNumPages())]:
text = p.extractText()
if not re.search(r'for\s+office\s+use\s+only', text, re.I):
pdf_out.addPage(p)
pdf_out.write(sys.stdout.buffer)
Будьте осторожны, текст может не отображаться в документе в точности так, как вам нужно. В документе PDF строки, слова или даже символы могут отображаться в неправильном порядке. Вместо потока текста документ может быть составлен из частей, появляющихся в определенных координатах.
Даже если текст упорядочен, что обычно и бывает, текст, охватывающий несколько страниц, будет иметь нижний колонтитул и верхний колонтитул посередине. Текст, охватывающий несколько строк, может иметь дополнительные пробелы вокруг переносов строк. Даже текст на одной строке может иметь несколько пробелов между словами из-за выравнивания текста (вот почему я использовал \s+
вместо простого пробела в регулярном выражении выше).
Инструменты, которые извлекают текст из PDF, пытаются реконструировать страницу как текст, но не всегда делают это идеально. Если pyPdf не работает с вашими документами, вы можете попробовать другие библиотеки для извлечения текста; см.этотиэтответка для некоторых примеров.
решение2
Одним из вариантов может стать использование командных редакторов PDF, таких как PDFEdit, Pdftk или PDFSaM. pdftotext может оказаться полезным в качестве простого способа определения номеров страниц, которые необходимо удалить.