web-dev-qa-db-fra.com

Comment extraire le titre d'un document PDF à partir d'un script pour renommer?

J'ai des milliers de fichiers PDF dans mes ordinateurs dont les noms proviennent de a0001.pdf à a3621.pdf, et à l'intérieur de chacun il y a un titre; par exemple. "carbonate d'aluminium" pour a0001.pdf, "nitrate d'aluminium" dans a0002.pdf, etc., que j'aimerais extraire pour renommer mes fichiers.

J'utilise ce programme pour renommer un fichier:

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)

Je voudrais savoir s'il existe des solutions pour extraire le titre intégré dans le fichier PDF pour renommer le fichier?

15
ParaH2

Installation du package

Cela ne peut pas être résolu avec du Python simple. Vous aurez besoin d'un package externe tel que pdfrw , qui vous permet de lire les métadonnées PDF. L'installation est assez facile en utilisant la norme Python gestionnaire de paquets pip.

Sous Windows , assurez-vous d'abord que vous disposez d'une version récente de pip à l'aide de la commande Shell:

python -m pip install -U pip

Sous Linux :

Sudo pip install -U pip

Sur les deux plates-formes, installez ensuite le package pdfrw en utilisant

Sudo pip install pdfrw

Le code

J'ai combiné les ansatzes de zeebonk et user2125722 pour écrire quelque chose de très compact et lisible qui est proche de votre code d'origine:

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)
14
Manu CJ

Ce dont vous avez besoin est une bibliothèque qui peut réellement lire les fichiers PDF. Par exemple pdfrw :

In [8]: from pdfrw import PdfReader

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

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

Vous pouvez utiliser la bibliothèque pdfminer pour analyser les fichiers PDF. La propriété info contient le titre du PDF. Voici à quoi ressemble un exemple d'informations:

[{'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'}]`

Ensuite, nous pouvons extraire le titre en utilisant les propriétés d'un dictionnaire. Voici le code entier (y compris l'itération de tous les fichiers et leur renommage):

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
user2125722

Vous ne pouvez consulter que les métadonnées à l'aide d'un outil ghostscript pdf_info.ps. Il était livré avec ghostscript mais est toujours disponible sur https://r-forge.r-project.org/scm/viewvc.php/pkg/inst/ghostscript/pdf_info.ps?view=markup&root=tm

3
mikep