如何在C#中使用iTextSharp编辑时避免使用双引号添加到作者元数据字段?
e.g。我正在将author1; author2传递给iTextSharp,但在编辑完成后。 PDF元数据显示“author1; author2”
答案 0 :(得分:1)
<强>更新强>
我已将此问题发送给Adobe,我几乎立即收到了答案:
报价是一个长期存在的问题,但100%正确并且有一个原因。他们将“Lowagie,Bruno”作为单一条目与Lowagie区别开来,Bruno作为两位独立作者出现。
既然我理解了添加引号的原因,我已经做了一些进一步的调查,我用这个答案与Adobe分享我的发现:
改编答案:
目前,iTextSharp实现了您的请求:
(Author 1; Author 2)
作为/Author
条目添加到信息词典中。<dc:creator><rdf:Seq><rdf:li>Author 1, Author 2</rdf:li></rdf:Seq></dc:creator>
。因此,Adobe Acrobat / Reader会显示如下元数据:
"Author 1; Author 2"
换句话说:Adobe添加双引号。这可以在此处查看:no_distinction_between_authors.pdf
这种方法有两个缺点:
为什么你认为这是一个iTextSharp错误:
可以预期iText会像这样添加作者的姓名:
(Author 1; Author 2)
作为/Author
条目添加到信息词典中。<dc:creator><rdf:Seq><rdf:li>Author 1</rdf:li><rdf:li>Author 2</rdf:li></rdf:Seq></dc:creator>
。这当然看起来比以前更正确,因为你现在有两个作者的两个列表项而不是两个作者的单个列表项。
不幸的是,Adobe Acrobat / Reader现在会显示作者的姓名:
"Author 1; Author 2"; Author 2
这看起来完全错了,但如果你看一下PDF(引擎盖下),所有数据都是正确的。这在此处得到证明:display_not_OK_pdfa_broken.pdf
这种方法有两个缺点:
如何解决此问题以使Adobe Acrobat / Reader感到满意:
可以让Adobe Acrobat / Reader正确显示作者:
(Author 1)
作为/Author
条目添加到信息词典中。<dc:creator><rdf:Seq><rdf:li>Author 1</rdf:li><rdf:li>Author 2</rdf:li></rdf:Seq></dc:creator>
。现在,当您查看Adobe Acrobat / Reader中的元数据时,您会看到:
Author 1; Author 2
这实际上是Adobe Acrobat在您手动添加几个作者时所执行的操作,以分号分隔。报价已经消失,外面看起来一切都很好。
这在以下证明:
这种方法的一个主要缺点是,在使用此方法时,您无法满足PDF / A合规性。如果您查看我们已更改的内容,您会看到我们从信息词典中删除了作者2,而我们将作者2保留在XMP元数据中。
不仅删除信息(实际上,因为XMP优先于信息字典而不是那么糟糕),但在PDF / A的上下文中也不允许这样:信息字典中的元数据需要与XMP流中的元数据相同,或者Adobe Acrobat中的PDF / A验证失败。
在我看来,Acrobat做错了。
我对Adobe的建议:
看看correct_but_display_not_OK_pdfa_broken.pdf。
当我查看PDF时,数据似乎反映了人们对现实世界的期望:
"Author 1"; "Author 2"
。即使作者姓名中有标点符号,不同作者之间的区别也是正确的。这符合我从Adobe收到的解释。<dc:creator><rdf:Seq><rdf:li>Author 1</rdf:li><rdf:li>Author 2</rdf:li></rdf:Seq></dc:creator>
,这正是我们想要的:两个不同作者的两个不同列表项。不幸的是,尽管作者现在以明确的方式存储在PDF中,无论是在信息字典还是XMP流中,Adobe Acrobat / Reader都以一种相当尴尬的方式将它们可视化:
"""Author 1""; ""Author 2"""; Author 2
这不是人们所期望的,因此:
您有两种选择:
在任何情况下:iText(夏普)都不会添加引号。当您查看PDF内部时,没有双引号。引号由PDF查看器添加,不由PDF生成器添加。