使用ghostscript和pdfmark更新pdf元数据时编码错误

时间:2012-02-08 05:18:43

标签: pdf encoding ghostscript pdf-manipulation

我有一个基础pdf文件,并希望使用ghostscript和pdfmark将标题更新为中文(UTF-8),如下所示

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=result.pdf base.pdf pdfmarks

pdfmarks文件(编码 UTF-8无BOM )低于

[ /Title (敏捷开发)
/Author (Larry Cai)
/Producer (xdvipdfmx (0.7.8))
/DOCINFO pdfmark

当我检查result.pdf

的属性时,命令已成功执行

标题更改为æŁ‘æ“·å¼•å‘

请给我提示如何解决此问题,gs命令或pdfmark中是否有任何参数?

3 个答案:

答案 0 :(得分:4)

PDF参考指出文档信息字典中的标题条目是“文本字符串”类型。文本字符串定义为使用带有字节顺序标记的PDFDocEncoding UTF-16BE(参见1.7 PDF参考手册的第158页)。

因此,如果没有BOM,则无法使用UTF-8指定标题。

我想如果你用一个使用带有BOM的UTF-16BE定义内容的字符串替换Title字符串,那么它将正常工作。我建议您使用十六进制字符串而不是常规PostScript字符串来指定数据,只是为了方便使用。

答案 1 :(得分:0)

关注pdfmark for docinfo metadata in pdf is not accepting accented characters in Keywords or Subject

我使用此函数从utf-8为info.txt创建字符串,供gs命令使用。

  function str_in_pdf($str){
    $cmd = sprintf("echo '%s'| iconv -t utf-16 |od -x -A none",$str);
    exec($cmd,$out,$ret);
    return "<" . implode("",$out) .">";
  }

答案 2 :(得分:0)

使用邱超文的想法,我的解决方案是下一个。通过BOM获取带有材料的UTF-16BE字符串

echo -n '(敏捷开发)' | iconv -t utf-16 |od -x -A none | tr -d ' \n' | sed 's/./\U&/g;s/^/</;s/$/>/'

您将获得<FEFF0028654F63775F0053D10029>。将其替换为标题。

/Title <FEFF0028654F63775F0053D10029>