鬼脚本赢了';t生成PDF/A时,DOCINFO中检测到UTF16BE文本字符串-尽管PDFACompatibilityPolicy另有说明

鬼脚本赢了';t生成PDF/A时,DOCINFO中检测到UTF16BE文本字符串-尽管PDFACompatibilityPolicy另有说明,pdf,pdf-generation,ghostscript,Pdf,Pdf Generation,Ghostscript,我正在尝试使用以下命令行将普通PDF文件转换为PDF/A: gs -dPDFA -dBATCH -dNOPAUSE -sProcessColorModel=DeviceCMYK -sDEVICE=pdfwrite -sPDFACompatibilityPolicy=1 -sOutputFile=output.pdf input.pdf 然而,我得到了这个信息 GPL Ghostscript 9.26: UTF16BE text string detected in DOCINFO cannot

我正在尝试使用以下命令行将普通PDF文件转换为PDF/A:

gs -dPDFA -dBATCH -dNOPAUSE -sProcessColorModel=DeviceCMYK -sDEVICE=pdfwrite -sPDFACompatibilityPolicy=1 -sOutputFile=output.pdf input.pdf
然而,我得到了这个信息

GPL Ghostscript 9.26: UTF16BE text string detected in DOCINFO cannot be represented in XMP for PDF/A1, reverting to normal PDF output
gs恢复为普通PDF格式。 显然,该消息源于gs,但在那里我们看到,该消息只能在
pdev->PDFACompatibilityPolicy==0
时出现。我的理解是,命令行中的参数
-sPDFACompatibilityPolicy=1
旨在防止这种情况发生

Q:为什么gs的行为就好像所需的策略是0而不是1?是否有其他方法将策略设置为1

而且,正如这让我好奇的那样:


Q:有没有办法看看是什么奇怪的DOCINFO导致了最初的问题,或者首先防止它?使用Acrobat Reader,我在文件中看不到任何“可疑”的内容。如果有帮助的话:input.pdf是从Word在窗口中生成的(我甚至尝试了UseISO19005-1设置,它应该首先生成pdf/A,但问题还是出现了)

您已将
-sPDFACompatibilityPolicy=1
。恐怕这是不正确的。Ghostscript有两种开关
-s
,用于处理字符串值,和
-d
用于处理数字和名称值(PostScript中的名称以“/”开头)

您已将字符串值“1”指定给参数PDFACompatbilityPolicy,该参数(内部)需要一个数值。由于需要从PostScript环境访问这些值,因此我们不能将类型混淆标记为错误。相反,我们将实际的控件保留为其默认值0

如果您改为设置
-dPDFACompatibilityPolicy=1
,我希望您会看到预期的行为

至于看数据,不看PDF文件我就说不出来。但是,如果您在调试器中停下来查看p->data,您将能够看到数据是什么。如果查看
pairs+i
而不是
pairs+i+1
,您将能够看到与DOCINFO pdfmark中的值关联的键

通过查看Acrobat中的文件,您将无法看到任何“可疑”的内容,因为Acrobat会将UTF16BE转换为系统所需的任何内容,以便正确显示文本。它甚至可能是ASCII,您仍然可以将其表示为UTF16


如果在文本编辑器中打开文件,您可能会看到相关字符串(请注意,Ghostscript中的BOM是八进制的,因此十六进制为0xFE 0xFF),前提是它不是在压缩对象流中。

检查最新Ghostscript(9.50)的源代码,在这种情况下,
PDFACompatibilityPolicy
值(参见第1951行附近的
devices/vector/gdevpdfm.c
)似乎设置了包含错误的行为:

  • 0将恢复为正常的PDF输出(不是我想要的)
  • 1将丢弃PDFINFO(甚至更糟)
  • 2将抛出错误(甚至更糟)
  • 开关中的任何其他值都将被忽略,并作为直通
所以,在我的例子中,整个问题都是通过设置

-dPDFACompatibilityPolicy=3
Ghostscript不会抱怨,不会中止PDF/A输出,不会丢弃PDFINFO,最重要的是,veraPDF checker仍然会验证PDF是否完全正常


我不是在评论这个解决方案有多丑陋,但它的效果非常好。由于所有其他switch语句都假定兼容性策略
0
如果传递的是2以上的任何内容,则此“快捷方式”似乎是一个意外但非常有用的错误。

exa的答案并不正确。Ghostscript将继续其输出,但生成的pdf将不符合veraPDF验证程序

现在我正忙着让ghostscript工作,所以我得到了一份有效的zugferd发票pdf。因此,PDF必须是有效的PDF/a-3(a、b或u)文件

答案有问题

如果只使用
-dPDFACompatibilityPolicy=3
verPDF将不会验证PDF

相反,您应该使用正确的编码修复文件

在我的例子中,pdf如下所示:

如何解决:

使用以下内容创建新文件(例如“pdfmarks”):

[ /Title (Foo Title)
  /Author (Foo Bar)
  /Subject (Foo Bar Subject)
  /Keywords ()
  /ModDate (D:20061204092842)
  /CreationDate (D:20061204092842)
  /Creator (Foo Bar)
  /Producer (Foo Bar)
  /DOCINFO pdfmark
(没有结束方括号“]”)

像这样运行gs:

窗口:
“C:\Program Files\gs\gs9.53.3\bin\gswin64c.exe”-dSAFER-dBATCH-dNOPAUSE-sDEVICE=pdfwrite-sOutputFile=/path/to/output.pdf/path/to/input.pdf/path/to/pdfmarks

Linux:
gs-dSAFER-dBATCH-dNOPAUSE-sDEVICE=pdfwrite-sOutputFile=/path/to/output.pdf/path/to/input.pdf/path/to/pdfmarks

你可以把你的东西放进去,也可以第二次打电话给gs


我希望我能用这个给你们一些时间。

马上!现在我必须找到一种自信地使用
-s
的方法(其中一种是我的底线)。(从发现的样本LLIN看来,它的意思是令人信服的,好像下面的含义是:代码定义>标记> >代码> > Snord= Valu/Cuff>设置一个值)请考虑我的答案,我贴出来,这看起来太好了!有什么简单的方法可以让它自动化吗?(我从Latex获得的pdf)另外,如何在pdfmarks文件中使用UTF-8字符?(它与utf兼容吗?)你想要一个运行这些命令的linux脚本吗?我可以提供。