Вопрос или проблема
Я работаю с довольно большими PDF-файлами, некоторые из которых содержат около 1700-2000 страниц. С ними становится довольно сложно работать, но они неплохо отформатированы на разные главы или разделы. Тем не менее, прыгать между разными разделами, например, если я пытаюсь их сравнить, или если я пытаюсь использовать раздел в качестве входных данных, скажем, для LLM, а не хочу, чтобы он работал с документом целиком, может быть неудобно.
Что, как мне кажется, было бы полезно, так это инструмент (желательно командной строки, чтобы я мог легко интегрировать его в сценарный процесс), который смог бы распознавать разные разделы и создавать новый файл, содержащий только эти разделы. Я был бы согласен, если бы он разбивал документ так, чтобы все страницы, содержащие части раздела, были в разных файлах, даже если это означает, что страница с концом одного раздела и началом другого появится в обоих главных файлах.
Большая часть работы, которая будет использовать это, выполняется на системе Ubuntu, хотя также доступны системы на базе RHEL. Я мог бы даже использовать решение для Windows, хотя решения на базе Linux предпочтительнее.
Похоже, многие из решений, которые я вижу, могут либо разбить каждую страницу на файл, либо указанный диапазон страниц. Я не знаю инструмента, который может автоматически обнаруживать, скажем, разделы, которые используются для создания таблицы содержимого (или даже просто использовать саму таблицу). Я полагаю, что мог бы вручную собрать страницы, упомянутые в таблице содержимого, и использовать их как границы для диапазона страниц, которые нужно включить в такой инструмент, как pdftk
, но я надеюсь, что есть более автоматизированное и менее подверженное ошибкам решение (поскольку все, что требует от меня ввода данных, должно быть корректным).
Идеальным вариантом был бы инструмент, но если есть библиотека (желательно на Python, но C, Java и, вероятно, другие тоже могут подойти), я мог бы попытаться реализовать эту функциональность сам с её помощью.
Ответ или решение
Для решения проблемы разделения крупных PDF-документов на главы или разделы существует несколько подходящих инструментов и библиотек, которые могут помочь вам автоматизировать этот процесс. Ниже представлены решения, которые могут быть полезными, учитывая ваш предпочтительный рабочий процесс в среде Ubuntu или RHEL, а также возможность использования Windows.
1. Использование библиотеки PyPDF2 в Python
Установка библиотеки
Для начала необходимо установить библиотеку PyPDF2, которая позволяет легко манипулировать PDF-документами.
pip install PyPDF2
Пример кода
Вы можете использовать следующий скрипт для извлечения разделов на основе страниц, указанных в оглавлении:
import PyPDF2
def split_pdf_by_toc(pdf_path, toc_page_ranges):
pdf_reader = PyPDF2.PdfReader(pdf_path)
for start, end in toc_page_ranges:
pdf_writer = PyPDF2.PdfWriter()
for page in range(start - 1, end): # Индексация с 0
pdf_writer.add_page(pdf_reader.pages[page])
output_filename = f"chapter_{start}_{end}.pdf"
with open(output_filename, 'wb') as output_pdf:
pdf_writer.write(output_pdf)
# Пример вызова функции
# Предполагаем, что вы знаете страницы, соответствующие оглавлению
toc_ranges = [(1, 10), (11, 20), (21, 30)] # Замените на ваши значения
split_pdf_by_toc("large_document.pdf", toc_ranges)
2. Использование командной строки с pdftk
Если вы предпочитаете команды в терминале, pdftk
может быть вам полезен, хотя нужно будет вручную указывать диапазоны страниц:
Установка pdftk
Вы можете установить pdftk
через пакетный менеджер:
sudo apt-get install pdftk
Пример использования
Для разделения документа на части:
pdftk large_document.pdf cat 1-10 output chapter_1_10.pdf
pdftk large_document.pdf cat 11-20 output chapter_11_20.pdf
Вы можете создать скрипт обертку, чтобы автоматизировать процесс на основе вашей структуры оглавления.
3. Инструменты с графическим интерфейсом
Если вы открыты к использованию графических инструментов, такие как PDFsam могут предложить удобный интерфейс для разделения PDF на части. Он доступен как для Windows, так и для Linux. Вы можете импортировать документ, указать страницы и сохранить новые файлы без необходимости писать код.
4. Использование кастомных решений
Если доступные инструменты не удовлетворяют вашим требованиям, вы можете рассмотреть разработку кастомного решения с использованием библиотеки PyMuPDF:
Установка
pip install PyMuPDF
Пример кода
import fitz # Это PyMuPDF
doc = fitz.open("large_document.pdf")
toc = doc.get_toc() # Получение оглавления
for i, entry in enumerate(toc):
# entry[1] — это номер страницы начала раздела
if i + 1 < len(toc):
start = entry[1]
end = toc[i + 1][1] - 1 # Конец – это первая страница следующего раздела
else:
start = entry[1]
end = doc.page_count # Если последний раздел, то конец документа
new_doc = fitz.open() # Создаем новый PDF
for page in range(start - 1, end):
new_doc.insert_pdf(doc, from_page=page, to_page=page)
new_doc.save(f"chapter_{i}.pdf")
Заключение
Выбор инструмента зависит от ваших предпочтений и требований к автоматизации. Представленные решения предоставляют надежные и удобные способы разделения PDFs по главам или разделам. Вышеописанные методы позволяют эффективно управлять крупными документами, делая процесс анализа и работы с ними более удобным.