【问题标题】:How to extract the title of a PDF document from within a script for renaming?如何从脚本中提取 PDF 文档的标题以进行重命名?
【发布时间】:2017-11-19 19:01:14
【问题描述】:

我的电脑中有数千个PDF文件,名称从a0001.pdfa3621.pdf,每个文件里面都有一个标题;例如a0001.pdf 中的“碳酸铝”,a0002.pdf 中的“硝酸铝”等,我想提取它们以重命名我的文件。

我用这个程序重命名一个文件:

path=r"C:\Users\YANN\Desktop\..."

old='string 1'
new='string 2'

def rename(path,old,new):
    for f in os.listdir(path):
        os.rename(os.path.join(path, f), os.path.join(path, f.replace(old, new)))

rename(path,old,new)

我想知道是否有解决方案来提取 PDF 文件中嵌入的标题以重命名文件?

【问题讨论】:

  • 您已经知道如何使用自定义逻辑重命名一堆文件。您不知道的是如何提取每个pdf 的标题。这将取决于这些 pdf 是如何生成的......已经有 a few Q/As 解决了如何使用 python 从 pdf 中提取文本。或者,也许这些文件具有泄露标题的元数据...如果您可以共享一个示例(一个文件),也许有人可以提供帮助。
  • 那么您想知道如何提取PDF文档的标题吗?该标题是如何嵌入在文本(第一个标题)或元数据中的?
  • 我没有让 python 进行重命名,而是让 python 将所有命令写入一个文件:mv oldname newname。查看该文件,进行手动编辑,然后获取它。这将为您省去麻烦,例如。多次写信给(无标题).pdf 或其他极端情况。

标签: python python-3.x file pdf


【解决方案1】:

安装包

这不能用普通的 Python 解决。您将需要一个外部包,例如 pdfrw,它允许您读取 PDF 元数据。使用标准 Python 包管理器pip 安装非常简单。

Windows 上,首先使用 shell 命令确保您拥有最新版本的 pip

python -m pip install -U pip

Linux 上:

pip install -U pip

在两个平台上,然后使用安装 pdfrw

pip install pdfrw

代码

我结合了 zeebonk 和 user2125722 的 ansatzes 编写了一些非常紧凑且易读的代码,与您的原始代码接近:

import os
from pdfrw import PdfReader

path = r'C:\Users\YANN\Desktop'


def renameFileToPDFTitle(path, fileName):
    fullName = os.path.join(path, fileName)
    # Extract pdf title from pdf file
    newName = PdfReader(fullName).Info.Title
    # Remove surrounding brackets that some pdf titles have
    newName = newName.strip('()') + '.pdf'
    newFullName = os.path.join(path, newName)
    os.rename(fullName, newFullName)


for fileName in os.listdir(path):
    # Rename only pdf files
    fullName = os.path.join(path, fileName)
    if (not os.path.isfile(fullName) or fileName[-4:] != '.pdf'):
        continue
    renameFileToPDFTitle(path, fileName)

【讨论】:

  • 这非常有用,但值得一提的是,很多 PDF 没有 Info.Title。在我检查的 312 篇相当随机的期刊文章中,超过 1/3 没有。但这对那些这样做的人来说很棒。
  • 请不要指示用户将sudopip install 一起使用。这是一个安全问题(请参阅here)。
【解决方案2】:

您需要的是一个可以实际读取 PDF 文件的库。例如pdfrw:

In [8]: from pdfrw import PdfReader

In [9]: reader = PdfReader('example.pdf')

In [10]: reader.Info.Title
Out[10]: 'Example PDF document'

【讨论】:

    【解决方案3】:

    您可以使用 pdfminer 库来解析 PDF。 info 属性包含 PDF 的标题。示例信息如下所示:

    [{'CreationDate': "D:20170110095753+05'30'", 'Producer': 'PDF-XChange Printer `V6 (6.0 build 317.1) [Windows 10 Enterprise x64 (Build 10586)]', 'Creator': 'PDF-XChange Office Addin', 'Title': 'Python Basics'}]`
    

    然后我们可以使用字典的属性提取标题。这是整个代码(包括迭代所有文件并重命名它们):

    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    import os
    
    start = "0000"
    
    def convert(var):
        while len(var) < 4:
            var = "0" + var
    
        return var
    
    for i in range(1,3622):
        var = str(i)
        var = convert(var)
        file_name = "a" + var + ".pdf"
        fp = open(file_name, 'rb')
        parser = PDFParser(fp)
        doc = PDFDocument(parser)
        fp.close()
        metadata = doc.info  # The "Info" metadata
        print metadata
        metadata = metadata[0]
        for x in metadata:
            if x == "Title":
                new_name = metadata[x] + ".pdf"
                os.rename(file_name,new_name)
    

    【讨论】:

      【解决方案4】:

      您可以使用 ghostscript 工具 pdf_info.ps 仅查看元数据。它曾经与 ghostscript 一起发布,但仍可在 https://r-forge.r-project.org/scm/viewvc.php/pkg/inst/ghostscript/pdf_info.ps?view=markup&root=tm

      获得

      【讨论】:

        【解决方案5】:

        基于 Ciprian Tomoiagă 的使用 pdfrw 的建议,我上传了一个 script,其中还包括:

        • 重命名子目录中的文件
        • 添加命令行界面
        • 通过附加随机字符串处理文件名已经存在的情况
        • 从新文件名中删除任何非字母数字字符
        • 用新文件名中的 ASCII (a e i o c) 替换非 ASCII 字符(如 á è í ò ç...)
        • 允许您从命令行设置根目录并限制新文件名的长度
        • 显示进度条,并在脚本完成后显示一些统计数据
        • 做一些错误处理

        正如 TextGeek 提到的,不幸的是,并非所有文件都有标题元数据,因此某些文件不会被重命名。

        存储库: https://github.com/favict/pdf_renamefy

        用法:

        下载文件后,运行pip安装依赖:

        $pip install -r requirements.txt
        

        然后运行脚本:

        $python -m renamefy <directory> <filename maximum length>
        

        ...其中 directory 是您要查找 PDF 文件的完整路径,filename maximum length 是文件名将被截断的长度以防标题太长或在文件中设置不正确。

        这两个参数都是可选的。如果没有提供,则将目录设置为当前目录,并将文件名最大长度设置为 120 个字符。

        示例

        $python -m renamefy C:\Users\John\Downloads 120
        

        我在 Windows 上使用它,但它应该也可以在 Linux 上运行。

        您可以随意复制、分叉和编辑。

        【讨论】:

          【解决方案6】:

          定义的解决方案存在一些问题,这是我的食谱

          from pathlib import Path
          from pdfrw import PdfReader
          import re
          
          path_to_files = Path(r"C:\Users\Malac\Desktop\articles\Downloaded")
          
          # Exclude windows forbidden chars for name <>:"/\|?*
          # Newlines \n and backslashes will be removed anyway
          exclude_chars = '[<>:"/|?*]'
          
          for i in path_to_files.glob("*.pdf"):
          
              try:
                  title = PdfReader(i).Info.Title
              except Exception:
                  # print(f"File {i} not renamed.")
                  pass
          
              # Some names was just ()
              if not title:
                  continue
          
              # For some reason, titles are returned in brackets - remove brackets if around titles
              if title.startswith("("):
                  title = title[1:]
          
              if title.endswith(")"):
                  title = title[:-1]
          
              title = re.sub(exclude_chars, "", title)
              title = re.sub(r"\\", "", title)
              title = re.sub("\n", "", title)
          
              # Some names are just ()
              if not title:
                  continue
          
              try:
                  final_path = (path_to_files / title).with_suffix(".pdf")
                  if final_path.exists():
                      continue
                  i.rename(final_path)
              except Exception:
                  # print(f"Name {i} incorrect.")
                  pass
          

          【讨论】:

          • 虽然还是有一定比例的文件,在acrobat reader的属性中有名字,但是pdfrw无法解析。但是对于 pdfminer 或 pyPDF2 都是一样的...
          【解决方案7】:

          安装后,打开应用程序并转到下载文件夹。您将在那里看到您下载的文件。只需长按要重命名的文件,底部就会出现重命名选项。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-11
            • 2020-01-06
            • 2011-03-25
            • 1970-01-01
            • 2011-01-18
            • 2011-10-23
            • 1970-01-01
            相关资源
            最近更新 更多