luk*_*asz 7 c# pdf byte-order-mark itextsharp digital-signature
我使用iTextSharp 5.5.1以数字方式使用分离签名(从第三方机构获得)签署PDF文件.一切似乎都运行正常,文件有效,例如Adobe Reader报告没有问题,将签名显示为有效等.
问题是Java客户端显然存在这些文件的一些问题 - 文件既不能打开也不能解析.
这些文件在标题中有一个字节顺序标记,这似乎会导致该行为(\ x00EF\x00BB\x00BF).
我可以像这样识别BOM:
PdfReader reader = new PdfReader(path);
byte[] metadata = reader.Metadata;
// metadata[0], metadata[1], metadata[2] contain the BOM
Run Code Online (Sandbox Code Playgroud)
我如何可以删除的BOM(不失签名的有效性),或强制iTextSharp的图书馆不将这些字节附加到文件?
首先要做的事情是:一旦PDF签名,您就不应该更改该PDF的任何字节,因为如果您这样做,您将使签名无效.
第二个观察:字节顺序标记不是 PDF标题的一部分(PDF始终以PDF开头%PDF-1.).在此上下文中,它是beginXMP元数据的处理指令中的属性的值.我不知道任何Java客户端在文件中的任何位置都有该字节序列的问题.如果他们确实遇到问题,那么客户端就会出现问题,而不是文件问题.
的字节顺序标记是UTF-8字符的存在的指示.在XMP的上下文中,我们在PDF中包含一个包含明文XML文件的流,该文件可由不具有"PDF感知"的软件使用.例如:
2 0 obj
<</Type/Metadata/Subtype/XML/Length 3492>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.1.0-jc003">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
dc:format="application/pdf"
pdf:Keywords="Metadata, iText, PDF"
pdf:Producer="iText® 5.5.4-SNAPSHOT ©2000-2014 iText Group NV (AGPL-version); modified using iText® 5.5.4-SNAPSHOT ©2000-2014 iText Group NV (AGPL-version)"
xmp:CreateDate="2014-11-07T16:36:55+01:00"
xmp:CreatorTool="My program using iText"
xmp:ModifyDate="2014-11-07T16:36:56+01:00"
xmp:MetadataDate="2014-11-07T16:36:56+01:00">
<dc:description>
<rdf:Alt>
<rdf:li xml:lang="x-default">This example shows how to add metadata</rdf:li>
</rdf:Alt>
</dc:description>
<dc:creator>
<rdf:Seq>
<rdf:li>Bruno Lowagie</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>Metadata</rdf:li>
<rdf:li>iText</rdf:li>
<rdf:li>PDF</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">Hello World example</rdf:li>
</rdf:Alt>
</dc:title>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
endstream
Run Code Online (Sandbox Code Playgroud)
这种非PDF感知软件将查找序列W5M0MpCehiHzreSzNTczkc9d,该序列不太可能在数据流中偶然出现.
该begin属性用于指示流中的字符使用UTF-8编码.他们在那里因为他们在那里是好的做法,但他们不是强制性的(ISO-16684-1).
您可以按照以下方式检索元数据(byte[] metadata = reader.Metadata;),删除字节,并使用如下PdfStamper实例更改流:
stamper.XmpMetadata = metadata;
Run Code Online (Sandbox Code Playgroud)
更改元数据后,您可以对PDF进行签名.
请注意,您的问题的一个方面让我感到惊讶.你写:
// metadata[0], metadata[1], metadata[2] contain the BOM
Run Code Online (Sandbox Code Playgroud)
非常奇怪的是,XMP元数据的前三个字节包含BOM.首先假设XMP元数据<?xpacket.如果没有,则通过删除这些字节来做正确的事情.
警告: PDF可以包含不同级别的XMP元数据.现在,您正在研究最常见的一个:文档级元数据.您可能会遇到包含页面级XMP元数据的PDF,在图像中使用XMP等...
| 归档时间: |
|
| 查看次数: |
944 次 |
| 最近记录: |