2010-08-05 3 views
2

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

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

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

Заранее благодарен.

ответ

1

Пробовать 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

Это просто получит метаданные из pdf-файла, который, как мне кажется (так же, как getDocumentInfo() в pyPdf), который не решает проблему. – Steven

2

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

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

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

+0

Спасибо за рекомендацию pyPdf, но ваш пример кода заставил мою систему зависать при вызове PdfFileReader, потому что файл должен быть открыт как двоичный: i = pyPdf.PdfFileReader (open (имя файла, «rb»)). – jimhark

+0

Спасибо, исправлено (это необходимо в Windows). – loevborg

3

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

0

Другой вариант для C++ - Poppler.

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

0

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

Смежные вопросы