Переименовать Pdf из заголовка PDF - PullRequest
2 голосов
/ 05 августа 2010

Я хочу организовать мой файл PDF, загруженный из Интернета.Понятно, что многие из них не по имени.Я хочу извлечь настоящий заголовок из файла.Здесь многие из них сгенерированы из латекса, и я думаю, что из скомпилированного pdf мы можем найти ключевое слово \ title {} или что-то в этом роде.Затем я хочу использовать это для переименования файла.

Я могу читать метаданные, используя pypdf.Но большинство PDF не содержит этого заголовка в своих метаданных.Я попробовал это со всеми своими коллекциями и не нашел ни одного!

Два вопроса: 1. Можно ли прочитать заголовок pdf, скомпилированный из pdf, скомпилированного из латекса.2. Какую библиотеку (в основном на C / C ++, Java, Python) я могу использовать для получения этой информации.

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 05 августа 2010

Я думаю, что это не совсем возможно. Информация 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 / другими языками.

2 голосов
/ 05 августа 2010

В Python лучше всего смотреть на pyPdf (пакет Debian: python-pypdf). Вот некоторый код:

import pyPdf, sys
filename=sys.argv[1]
i=pyPdf.PdfFileReader(open(filename,"rb"))
d=i.getDocumentInfo()
print d["/Title"]

По моему опыту, немногие PDF-файлы имеют установленный атрибут "/ Заголовок", поэтому ваш пробег может отличаться. В этом случае вам придется угадывать заголовок по содержимому, которое должно быть подвержено ошибкам. pyPdf может помочь вам и в этом.

1 голос
/ 05 августа 2010

Попробуйте iText (Java). Я нашел этот пример, попробуйте (вы можете добавить дженерики, если они поддерживаются):

PdfReader reader = new PdfReader("yourpdf.pdf");
HashMap map= reader.getInfo();
Set keys = map.keySet();
Iterator i = keys.iterator();

while(i.hasNext()) {
    String thiskey = (String)i.next();
    System.out.println(thiskey + ":" + (String)map.get(thiskey));
}
0 голосов
/ 11 февраля 2018

Лучшее решение, которое я нашел для переименования файлов PDF, используя не просто заголовок, а любой текст, который вам нужен в файле PDF, - это приложение переименования A-PDF , оно очень хорошо работает для всех файлов, которые я пробовал .

0 голосов
/ 05 августа 2010

Еще одна опция для C ++ - это Poppler.

Я пытался сделать что-то подобное в прошлом (и спрашивал здесь: Извлечение текста из PDF с помощью Poppler (C ++) ), но так и не получилось. В конце дня я понял, что по крайней мере для моего использования было проще переименовать файлы вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...