Удалить определенные страницы PDF в зависимости от содержания

Удалить определенные страницы PDF в зависимости от содержания

У меня более 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 может оказаться полезным в качестве простого способа определения номеров страниц, которые необходимо удалить.

Связанный контент