在Python中生成pdf文件校验和时不包括元数据

时间:2018-12-19 23:08:45

标签: python python-3.x pypdf2

我打算在文件上生成一个校验和,然后将校验和作为文件本身的元数据。但是,我面临的问题是在将元数据放入文件之前和之后生成的校验和不同,我意识到发生这种情况是因为文件中的元数据已更改。 这就是我在Python 3中对PyPDF2所做的事情:

import os
import sys
import time
import hashlib

from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.generic import NameObject, createStringObject

1。生成文件的MD5校验和的功能

def md5_checksum(filePath):
    try:
        with open(filePath, 'rb') as file:
            m = hashlib.md5()
            while True:
                data = file.read(8192)
                if not data:
                    break

                m.update(data)

            return m.hexdigest()
    except IOError:
        print('[ERROR][NOT FOUND]: ' + filePath)
        return 'NULL'
    finally:
        file.close()

2。将元数据嵌入PDF文件的功能

def embedd_metadata_file(file_in, file_out, metadatas):
    with open(file_in, 'rb') as fin:
        pdf = PdfFileReader(fin)
        writer = PdfFileWriter()
        metadata = writer._info.getObject()
        info = pdf.documentInfo

        for page in range(pdf.getNumPages()):
            writer.addPage(pdf.getPage(page))

        for key in info:
            metadata.update({NameObject(key): createStringObject(info[key])})

        for key in metadatas:
            metadata.update({NameObject(key): createStringObject(str(metadatas[key]))})

        metadata.update({
            NameObject('/Pages'): createStringObject(str(pdf.getNumPages()))
        })

        with open(file_out, 'wb') as fout:
            writer.write(fout)

    fin.close()
    fout.close()

    os.unlink(file_in)
    os.rename(file_out, file_in)

    pdf = PdfFileReader(open(file_in, 'rb'))
    return pdf.getDocumentInfo()

3。调用函数

file = 'example.pdf'
file_in = os.path.join(DIR, file)
file_out = os.path.join(DIR, file + '.OUT.pdf')

checksum = md5_checksum(file_in)
metadata = embedd_metadata_file(file_in, file_out, {
    '/MD5Checksum': checksum,
    '/ISBN': 'xxx-xxxx-xxxxxxx-xxx',
    '/eISBN': 'xxx-xxxx-xxxxxxx-xxx,
    '/Title': 'Blablablabla',
    '/Size': '2.3 MB',
    '/Author': 'Some Author',
    '/Copyright': 'Blabla Blablabla',
    '/Version': '2',
    '/Publisher': 'Blablablabla Blabla'
})

问题是,如何在不更改文件本身的校验和的情况下将校验和作为元数据文件放置?任何帮助,我都很感激。

1 个答案:

答案 0 :(得分:0)

您可以按照NIX软件包管理器的方式进行操作。您将“ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”作为哈希插入,对文件进行校验和,然后将其替换为真实的哈希。选中文件后,您可以用X替换哈希,然后对文件进行哈希处理。

但是我不会使用PDF。对于PDF,最好对它们进行签名。