【问题标题】:Rename Pdf from Pdf title从 Pdf 标题重命名 Pdf
【发布时间】:2011-03-25 15:13:00
【问题描述】:

我想整理从 Internet 下载的 pdf 文件。很明显,他们中的许多人名不副实。我想从文件中提取真正的标题。这里有很多是从 Latex 生成的,我认为从编译的 pdf 中我们可以找到 \title{} 关键字或类似的东西。然后我想用它来重命名文件。

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

两个问题: 1.是否可以读取从latex编译的pdf编译的pdf标题。 2. 我可以使用哪个库(主要是 C/C++、java、python)来获取这些信息。

提前致谢。

【问题讨论】:

    标签: java python c++ pdf


    【解决方案1】:

    我认为这是不可能的。 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】:

      在 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 也可以帮助您。

      【讨论】:

      • 感谢您的 pyPdf 推荐,但您的示例代码导致我的系统挂起对 PdfFileReader 的调用,因为该文件必须以二进制形式打开:i=pyPdf.PdfFileReader(open(filename,"rb "))。
      • 谢谢,已修复(这在 Windows 上是必需的)。
      【解决方案3】:

      试试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));
      }
      

      【讨论】:

      • 这只会从我认为的pdf中获取元数据(就像pyPdf中的getDocumentInfo()一样),这并不能解决问题。
      【解决方案4】:

      C++ 的另一个选择是 Poppler。

      我过去曾尝试做类似的事情(并在这里寻求建议: Extracting text from PDF with Poppler (C++) )但从未真正让它工作。最终我意识到,至少对于我的使用而言,手动重命名文件更容易。

      【讨论】:

        【解决方案5】:

        我找到的重命名 PDF 文件的最佳解决方案不仅仅是标题,而且您需要在 pdf 文件中的任何文本都是 A-PDF rename 应用程序,它对我尝试过的所有文件都非常有效。

        【讨论】:

          猜你喜欢
          • 2016-07-03
          • 1970-01-01
          • 1970-01-01
          • 2017-11-19
          • 2019-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多