Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用“pdfrw”添加元数据时如何正确解码/编码文件名?_Python_Pdf_Unicode_Character Encoding_Pdfrw - Fatal编程技术网

Python 使用“pdfrw”添加元数据时如何正确解码/编码文件名?

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=[]

我正在编写一个脚本,将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=[]
   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,也不涉及直接十六进制编码。