2

我正在编写一个脚本,它将 PDF 元数据添加到 PDF 列表中。

我的问题是处理名称中包含某些字符的 PDF——在我尝试的示例中,名称中有一个“短划线”,但我确定将来(我不控制这些文件名) 还会有其他类似的问题。

我正在使用pdfrwPython 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!')

这适用于没有“破折号”的文件。带有“破折号”的文件显示它在我运行它时已被修改,但是当我在 Adob​​e Acrobat 中检查元数据时,那里什么也没有。

我很确定这是某种编码问题。由于它将“破折号”显示为x\96,因此它必须使用 cp1252。我正在使用 Spyder 2.3.1,并且在我的脚本顶部有 # - - coding: utf-8 - -。

我通读了The Absolute Minimum Every Softward Developer Absolutely, Positively Must Know About Unicode and Character Sets and Pragmatic Unicode,我知道,一般来说,我想解码输入,运行其余代码(上面没有打印,但我使用从数据库中提取信息的文件名,然后格式化该信息并希望将结果字符串放入元数据中),然后再次对其进行编码。但我一直无法弄清楚任何有效的方法。

我认为解决方案将是以下之一:

  1. [最佳] 正确处理编码问题。

  2. 在子文件夹上运行某种批处理文件,将文件重命名为脚本可以处理的名称,然后在最后反转名称(它们需要以原始文件名结尾)。

我很感激任何帮助!我一直找不到任何有效的方法。

4

3 回答 3

1

您新获得的 Unicode 知识不会帮助您处理 PDF。PDF 在 Unicode 出现之前就出现了。

您应该在 Adob​​e 发布的官方ISO 32000_2008 PDF-1.7 规范中查找“附件 D(规范):字符集和编码”,从第 651 页开始。

在那里你会发现你应该使用en-dash

  • \263用于标准编码
  • \230Mac 编码
  • \226用于 WinEncoding
  • \205用于 PDF 编码

对于元数据(/Info字典),使用 PDFEncoding。

于 2015-07-07T18:09:12.163 回答
0

更符合您的第二个解决方案 - 您可以将文件复制到 内部的另一个路径add_keywords,然后执行这些操作PdfWriter,然后将其复制回来吗?您可以使用tempfile.mkstemp()来获取临时文件名,或者如果您一次只做一个,只需在某处选择一个名称......

于 2015-07-10T03:53:33.210 回答
0

不幸的是,我还没有足够的声誉让我对 stackoverflow 发表评论,所以这更像是评论而不是真正的答案。(我是pdfrw作者。)

“带有“破折号”的文件表明它在我运行它时被修改了,但是当我在 Adob​​e Acrobat 中检查元数据时,那里什么也没有。”

这真的很奇怪。您确定看到的是修改时间,还是看到了访问时间(例如,由于某种原因,读取有效,但写入无效)?

无论如何,我想建议的事情(出于调试目的)是您首先将“writer.write(filename)”替换为“writer.write('modified_'+ filename)”之类的东西

您还可以在循环中打印文件名,以确保确实可以看到这些文件。

最后,pdfrw 中的文件名处理非常基础,但如果出于某种原因需要,您可以自己打开文件并将文件对象传递给读取器和写入器。

于 2015-07-10T19:12:53.490 回答