从Pdf标题重命名Pdf

时间:2010-08-05 05:51:34

标签: java python c++ pdf

我想整理从互联网上下载的pdf文件。很明显,他们中的许多人名声不好。我想从文件中提取真实的标题。其中很多是从Latex生成的,我认为从编译的pdf中我们可以找到\ title {}关键字或类似的东西。我想用它来重命名文件。

我可以使用pypdf读取元数据。但大多数pdf在其元数据中不包含该标题。我已经尝试了所有我的收藏品,但没有找到!

两个问题: 1.是否可以阅读从乳胶编制的pdf编译的pdf标题。 2.我可以使用哪个库(主要是C / C ++,java,python)来获取该信息。

提前致谢。

5 个答案:

答案 0 :(得分:3)

我认为这不太可能。 pdf中不再包含LaTeX信息。如果元数据中不存在标题,则可以从结构信息中推断出标题,如果它是“标记的pdf”。然而,大多数pdf都不是,而那些可能会提供元数据。

这使您可以进行布局分析:尝试通过查看布局特征来确定文档中的标题。对于python,您可能需要查看pdfminer。 以下示例使用pdfminer以相当简单的方法确定标题:

  • 我们假设标题在第一页的某个地方
  • 我们将其留给pdfminer以识别第一页上的“文本块”
  • 我们假设标题打印得比页面的其他部分“更大”。查看文本块中每行的高度,我们确定哪个块包含“最高”行,并假设该块包含标题
  • 我们让pdfminer从块中提取文本,
  • 文本可能包含换行符(由pdfminer放置),因为标题可能包含多行,以及其他不必要的空格,所以我们做了一些简单的空白规范化(用一个空格替换连续的空格,并去掉前导和尾随whitespace),就是这样!

正如我所说:这种方法相当简单,可能会或可能不会为您的文档带来好结果,但它可能会指向正确的方向。在这里:

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重命名应用程序,它对我尝试过的所有文件都很有用。