Я думаю, что это действительно невозможно. Информация LaTeX больше не присутствует в pdf. Если название отсутствует в метаданных, вы можете вывести заголовок из информации о структуре, если это «помеченный pdf». Однако большинство pdf-файлов не являются, и те, которые, вероятно, будут предоставлять метаданные в любом случае.
Это дает вам анализ макета: попробуйте определить, что такое название из документа, просмотрев характеристики макета. Для python вы можете взглянуть на pdfminer. В следующем примере используется pdfminer определить название, используя довольно упрощенный подход:
- мы предполагаем, что название находится где-то на первой странице
- мы оставляем его pdfminer признать «блоки текста» на на первой странице
- мы предполагаем, что заголовок печатается «больше», чем остальная часть страницы. Рассматривая высоту каждой строки в текстовых блоках, мы определяем, в каком блоке содержится «самая высокая» строка, и предположим, что этот блок содержит заголовок
- мы разрешаем pdfminer извлекать текст из блока,
- текст будет вероятно, содержат символы новой строки (помещаемые pdfminer), поскольку заголовок может содержать более одной строки и другие ненужные пробелы, поэтому мы выполняем некоторую простую нормализацию пробелов (заменяем последовательные пробелы на единое пространство и разделяем ведущие и конечные пробелы), и это все !
Как я сказал: этот подход является довольно упрощенным и может дать или не дать хорошие результаты для ваших документов, но он может указывать на вас в правильном направлении.Вот он идет:
import sys
import re
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBox
filename = sys.argv[1]
fp = open(filename, 'rb')
parser = PDFParser(fp)
doc = PDFDocument()
parser.set_document(doc)
doc.set_parser(parser)
doc.initialize()
rsrcmgr = PDFResourceManager()
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interp = PDFPageInterpreter(rsrcmgr, device)
pages = doc.get_pages()
first_page = pages.next()
interp.process_page(first_page)
layout = device.get_result()
textboxes = [i for i in layout if isinstance(i, LTTextBox)]
box_with_tallest_line = max(textboxes, key=lambda x: max(i.height for i in x))
text = box_with_tallest_line.get_text()
print re.sub('\s+', ' ', text).strip()
Я оставлю переименование файла к вам (обратите внимание, что заголовок может содержать символы, которые Вы не могли бы хотеть, или, что даже не действительны в именах файлов). Документация Pdfminer на данный момент довольно скудная, поэтому вы можете запросить в списке рассылки, если вам нужно знать больше. (не знаю об этом сам, но не мог удержаться от попытки ;-)). Или вы можете попробовать аналогичный подход с другими библиотеками PDF/другими языками.
Это просто получит метаданные из pdf-файла, который, как мне кажется (так же, как getDocumentInfo() в pyPdf), который не решает проблему. – Steven