Python 使用“pdfrw”添加元数据时如何正确解码/编码文件名?
我正在编写一个脚本,将PDF元数据添加到PDF列表中 我的问题是处理名称中包含某些字符的PDF——在我尝试的示例中,名称中有一个“en破折号”,但我确信将来(我不控制这些文件名)会有其他类似的问题 我使用的是Python 使用“pdfrw”添加元数据时如何正确解码/编码文件名?,python,pdf,unicode,character-encoding,pdfrw,Python,Pdf,Unicode,Character Encoding,Pdfrw,我正在编写一个脚本,将PDF元数据添加到PDF列表中 我的问题是处理名称中包含某些字符的PDF——在我尝试的示例中,名称中有一个“en破折号”,但我确信将来(我不控制这些文件名)会有其他类似的问题 我使用的是pdfrw和Python 2.7。目前我有: from pdfrw import PdfReader,PdfWriter from os import listdir def get_files(pwy): tr_files=listdir(pwy) tr_files2=[]
pdfrw
和Python 2.7。目前我有:
from pdfrw import PdfReader,PdfWriter
from os import listdir
def get_files(pwy):
tr_files=listdir(pwy)
tr_files2=[]
for t in tr_files:
tr_files2.append(pwy+'/'+t)
return tr_files2
def add_keywords(filename,keywords):
writer=PdfWriter()
trailer=PdfReader(filename)
trailer.Info.Keywords=keywords
writer.trailer=trailer
writer.write(filename)
file_list=get_files('C:/example_folder')
for f in file_list:
add_keywords(f,'some exciting metadata!')
这适用于没有“en-dash”的文件。带有“en-dash”的文件显示,在我运行此程序时,它已被修改,但当我在Adobe Acrobat中检查元数据时,却什么都没有
我很确定这是某种编码问题。由于“en-dash”显示为x\96
,因此必须使用cp1252。我正在使用Spyder 2.3.1,我的脚本顶部有#——编码:utf-8
我通读了一遍,我知道,一般来说,我想解码输入,运行代码的其余部分(上面没有打印,但我使用文件名从数据库中提取信息,然后格式化该信息,并希望将结果字符串放入元数据),然后再次编码。但我还没找到任何有效的方法
我认为解决方案将是以下之一:
谢谢你的帮助!我找不到任何有效的方法。您刚获得的Unicode技术将无法帮助您使用PDF。PDF在Unicode出现之前就已经出现了 您应查阅官方文件第651页的“附录D(规范性):字符集和编码” 在这里,您会发现您应该使用en-dash:
- 标准编码的
\263
用于编码\230
用于葡萄酒编码\226
- 用于PDF编码的
\205
对于元数据(
/Info
字典),请使用PDFEncoding。关于第二种解决方案的更多内容-您是否可以将文件复制到add_keywords
中的另一个路径,然后执行PdfWriter
操作,然后将其复制回来?您可以使用tempfile.mkstemp()
来获取临时文件名,或者如果您一次只打算创建一个文件名,只需在某个地方选择一个名称…不幸的是,我还没有足够的声誉让stackoverflow让我对这个问题发表评论,因此这更多的是一个评论,而不是一个真正的答案。(我是pdfrw的作者。)
带有“en-dash”的文件显示,在我运行此程序时,它已被修改,但当我在Adobe Acrobat中检查元数据时,却什么都没有
真奇怪。您确定看到的是修改时间,还是访问时间(例如,由于某种原因,读取工作正常,但写入工作不正常)
无论如何,我想建议(出于调试目的)首先将“writer.write(filename)”替换为“writer.write('modified_'+filename)”
您还可以在循环中打印文件名,以确保确实可以看到这些文件
最后,pdfrw中的文件名处理非常基本,但是如果出于某种原因需要,您可以自己打开文件,并将文件对象传递给读写器。我认为这不是问题所在,因为编码问题不在于PDF元数据,而在于读取的PDF名称。我认为正在发生的是,该文件被称为hello--world.pdf,它试图写入hello\x96world.pdf,当然,它并不存在。我认为PDF元数据实际上与这个问题无关——它只是相关的,因为我使用的是pdfrw包,所以我认为它如何写入文件可能很重要。您的$headline清楚地谈到“使用
pdfrw
对文件名进行编码以添加元数据”。所以我的答案是适用的。公平地说,它说“使用pdfrw添加元数据时对文件名进行编码。”所以我肯定可以提高我的问题标题技巧,但这并不是错误的。使用pdfrw添加元数据的目的是添加上下文。我的回答比元数据有更广泛的含义。我向您指出了仅有的25页,其中有几个与您的问题相关的巨大表格,这些表格显示,既不涉及utf8,也不涉及直接十六进制编码。