使用Pikepdf编辑元数据

问题描述

有使用pikepdf编辑pdf元数据的经验吗?

我安装了此库,因为其他库似乎在目录和/或书签方面存在一些问题。我还尝试了pdfrw,但是该库无法覆盖现有值,因此,我现在尝试一下pikepdf。

文档说:

在with块中打开元数据以将其打开以进行编辑。退出该块后,将提交更改(更新XMP和文档信息字典)并将其附加到PDF对象。 PDF必须仍然保存。如果该块中发生异常,则更改将被丢弃。

In [4]: with pdf.open_Metadata() as Meta:
   ...:     Meta['dc:title'] = "Let's change the title"

我已经尝试过使用函数的这种方法

from pikepdf import Pdf

def add_Metadata(source_pdf,author,title,out_dir):
    with Pdf.open(source_pdf) as pdf:
        with pdf.open_Metadata() as Meta:

            Meta['dc:title'] = title
            Meta['dc:creator'] = author
    
        pdf.save(os.path.join(out_dir,os.path.basename(source_pdf)))

保存后,没有任何变化。我在这里想念明显的东西吗?

如果我在函数添加一个断点并尝试检查现有值,则会出现找不到键的错误。所以我想这是问题的一部分-我无法访问正确的键,但是如何查看open_Metadata()返回的对象中存在哪些键值对? 如果按原样打印“元”对象,则会得到以下信息:

<x:xmpMeta xmlns:x="adobe:ns:Meta/"
            x:xmptk="XMP toolkit 2.9.1-13,framework 1.6">
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-Syntax-ns#"
            xmlns:iX="http://ns.adobe.com/iX/1.0/">
        <rdf:Description xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
                        rdf:about="Q"
                        pdf:Producer="GPL Ghostscript 8.70"/>
        <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/"
                        rdf:about="W">
            <xmp:ModifyDate>2020-05-28T09:26:1Z</xmp:ModifyDate>
            <xmp:CreateDate>2020-05-28T09:26:1Z</xmp:CreateDate>
            <xmp:CreatorTool>XYZ</xmp:CreatorTool>
        </rdf:Description>
        <rdf:Description xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"
                        rdf:about="E"
                        xapMM:DocumentID="R"/>
        <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/"
                        rdf:about="T"
                        dc:format="application/pdf">
            <dc:title>
                <rdf:Alt>
                    <rdf:li xml:lang="x-default">UnkNown</rdf:li>
                </rdf:Alt>
            </dc:title>
            <dc:creator>
                <rdf:Seq>
                    <rdf:li>user-id,S-D-F-G-12345678</rdf:li>
                </rdf:Seq>
            </dc:creator>
        </rdf:Description>
    </rdf:RDF>
</x:xmpMeta>

print(Meta.keys())-> KeysView(<pikepdf.models.Metadata.PdfMetadata object at 0x000001E4024306A0>)

list(Meta.keys())-> []

有人可以指出我正确的方向吗?如何更改值“未知”和“用户ID,S-D-F-G-12345678”?

解决方法

解决方法:删除所有元数据,然后添加新的元数据。