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

使用ghostscript和pdfmark更新pdf元数据时编码错误,pdf,encoding,ghostscript,pdf-manipulation,Pdf,Encoding,Ghostscript,Pdf Manipulation,我有一个基本的pdf文件,希望使用ghostscript和pdfmark将标题更新为中文(UTF-8),命令如下 gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=result.pdf base.pdf pdfmarks pdfmarks文件(编码为不带BOM的UTF-8)如下所示 当我检查result.pdf 标题更改为æŁ'æ'·å¼•å' 请告诉我如何解决这个问题,在gs命令或pdfmark中是否有任何参数?PDF参考说明文档信息字典

我有一个基本的pdf文件,希望使用ghostscript和pdfmark将标题更新为中文(UTF-8),命令如下

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=result.pdf base.pdf pdfmarks
pdfmarks文件(编码为不带BOM的UTF-8)如下所示

当我检查
result.pdf

标题更改为
æŁ'æ'·å¼•å'


请告诉我如何解决这个问题,在
gs
命令或pdfmark中是否有任何参数?

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

因此,在没有BOM表的情况下,无法使用UTF-8指定标题

我可以想象,如果您将标题字符串替换为使用UTF-16BE和BOM定义内容的字符串,那么它将正常工作。我建议您使用十六进制字符串而不是常规PostScript字符串来指定数据,只是为了便于使用。

遵循

我使用此函数从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) .">";
  }
pdf($str)中的函数str{ $cmd=sprintf(“echo'%s'| iconv-t utf-16 | od-x-A none”,$str); 执行官($cmd,$out,$ret); 返回“”; }
使用Happyman Chiu的想法,我的解决方案是下一个。通过

echo -n '(敏捷开发)' | iconv -t utf-16 |od -x -A none | tr -d ' \n' | sed 's/./\U&/g;s/^/</;s/$/>/'
echo-n'(敏捷开发)' | iconv-t utf-16 | od-x-A none | tr-d'\n'| sed's/\U&/g;s/^/'
您将获得
。将此替换为标题

/Title <FEFF0028654F63775F0053D10029>
/Title

谢谢,使用来自的工具,我成功地使其工作。该工具将其转换为“带字节顺序标记的UTF-16BE”
/Title <FEFF0028654F63775F0053D10029>