중요한 것부터 먼저 주말 : 이상 업데이 트를 게시 할 예정입니다 ... 다시 그것을 추가 할 수 있습니다 서명하면 무효화됩니다.
두 번째 관찰 : 바이트 순서 표시는 이 아니며이 아닙니다 (PDF는 항상 %PDF-1.
으로 시작합니다). 이 컨텍스트에서 XMP 메타 데이터 처리 명령의 begin
특성 값입니다. 필자는 파일 내의 바이트 시퀀스에 문제가있는 자바 클라이언트를 모른다. 문제가 있다면 클라이언트가 아닌 파일에 문제가 있습니다.
Byte Order Mark은 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
이러한 비 PDF 인식 소프트웨어는 데이터 스트림에 사고로 나타날 가능성이 순서입니다 순서 W5M0MpCehiHzreSzNTczkc9d
, 찾습니다.
begin
속성은 스트림의 문자가 UTF-8 인코딩을 사용함을 나타냅니다. 그들은 거기에있는 것이 바람직하기 때문에 거기에 있지만 의무는 아닙니다 (ISO-16684-1).
당신은, 메타 데이터 당신이 (
byte[] metadata = reader.Metadata;
를) 할 방법을 검색 바이트를 제거하고이 같은
PdfStamper
인스턴스가 흐름을 바꿀 수
: 메타 데이터를 변경 한 후
stamper.XmpMetadata = metadata;
, 당신이 서명 할 수 있습니다 PDF.
질문의 한 측면에서 저를 놀라게합니다. 당신은 다음과 같이 씁니다 :
// metadata[0], metadata[1], metadata[2] contain the BOM
XMP 메타 데이터의 처음 3 바이트가 BOM을 포함한다는 것은 매우 이상합니다. XMP 메타 데이터는 <?xpacket
으로 시작한다고 가정합니다. 그렇지 않은 경우 해당 바이트를 제거하여 올바른 작업을 수행하고 있습니다.
경고 : PDF는 다양한 수준의 XMP 메타 데이터를 포함 할 수 있습니다. 현재 가장 일반적인 문서 수준 메타 데이터 인 문서 수준의 메타 데이터를 검토하고 있습니다. 이미지 내에 XMP가있는 페이지 수준의 XMP 메타 데이터가있는 PDF가 나타날 수 있습니다.
방금 확인한 바 iTextSharp는 자체적으로 BOM을 추가하지 않습니다. 원본 PDF에는 서명하기 전에 PDF가 있거나 BOM을 추가하는 것이 있습니다. – divanov
메타 데이터 (PDF 파일의 어딘가에 임베드 됨)에는 일반적으로 BOM이 있으며 정상입니다. * 문제는 자바 클라이언트가 분명히 그 파일들에 문제가있는 것입니다 - 어떤 자바 클라이언트입니까? – mkl
@mkl : 먼저 InputStream이 바이트 배열을 읽으면 xml을 파싱 할 때 XMLPullParse (android)가 XmlPullParserException을 던집니다. BOMInputStream을 사용하면 String에서 BOM을 제거하므로 XMLPullParser는 어쨌든 읽을 수 있습니다. 하지만 제 요구 사항은 BOM이없는 원본 파일을 갖는 것입니다. – lukasz