我想整理从互联网上下载的pdf文件。很明显,他们中的许多人名声不好。我想从文件中提取真实的标题。其中很多是从Latex生成的,我认为从编译的pdf中我们可以找到\ title {}关键字或类似的东西。我想用它来重命名文件。
我可以使用pypdf读取元数据。但大多数pdf在其元数据中不包含该标题。我已经尝试了所有我的收藏品,但没有找到!
两个问题: 1.是否可以阅读从乳胶编制的pdf编译的pdf标题。 2.我可以使用哪个库(主要是C / C ++,java,python)来获取该信息。
提前致谢。
答案 0 :(得分:3)
我认为这不太可能。 pdf中不再包含LaTeX信息。如果元数据中不存在标题,则可以从结构信息中推断出标题,如果它是“标记的pdf”。然而,大多数pdf都不是,而那些可能会提供元数据。
这使您可以进行布局分析:尝试通过查看布局特征来确定文档中的标题。对于python,您可能需要查看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库/其他语言类似的方法。
答案 1 :(得分:2)
在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设置了“/ Title”属性,因此您的里程可能会有所不同。在这种情况下,你必须从内容中猜出标题,这必然容易出错。 pyPdf
也可以为您提供帮助。
答案 2 :(得分: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));
}
答案 3 :(得分:0)
C ++的另一个选择是Poppler。
我过去曾尝试过类似的事情(并在此提出建议: Extracting text from PDF with Poppler (C++))但从未真正让它发挥作用。在一天结束时,我意识到至少对我来说,手动重命名文件更容易。
答案 4 :(得分:0)
我找到的最好的解决方案是使用不是jus tittle的renamin PDF文件,但是pdf文件中需要的任何文本都是A-PDF重命名应用程序,它对我尝试过的所有文件都很有用。