如何从脚本中提取PDF文档的标题以进行重命名?

时间:2017-06-16 22:22:54

标签: python python-3.x file pdf

我的计算机中有数以千计的PDF文件,其名称来自a3621.pdfa0001.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) 中的“硝酸铝”等,我想提取以重命名我的文件。

我使用此程序重命名文件:

SdkContext.AzureCredentialsFactory

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

7 个答案:

答案 0 :(得分:14)

安装包

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

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

python -m pip install -U pip

Linux

sudo pip install -U pip

在两个平台上,使用

安装pdfrw
sudo pip install pdfrw

代码

我结合了zeebonk和user2125722的问题来编写一些非常紧凑和可读的内容,它与原始代码非常接近:

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)

答案 1 :(得分:6)

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

In [8]: from pdfrw import PdfReader

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

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

答案 2 :(得分:4)

您可以使用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)

答案 3 :(得分:3)

您只能使用ghostscript工具pdf_info.ps查看元数据。它曾经随附ghostscript,但仍可在https://r-forge.r-project.org/scm/viewvc.php/pkg/inst/ghostscript/pdf_info.ps?view=markup&root=tm

处使用

答案 4 :(得分:0)

基于 CiprianTomoiagă的使用 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>

...,其中目录是您要查找PDF文件的完整路径,而 filename最大长度是文件名将被截断的长度如果标题太长或文件中的标题设置不正确。

两个参数都是可选。如果未提供任何内容,则目录设置为当前目录,文件名最大长度设置为120个字符。

示例

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

我在Windows上使用了它,但是它也应该在Linux上工作。

随意复制,合并和编辑。

答案 5 :(得分:0)

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

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

答案 6 :(得分:-4)

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