2014-10-09 1 views
7

iTextSharp 5.5.1을 사용하여 분리 된 서명 (타사 기관에서 가져온 것)으로 PDF 파일을 디지털 서명합니다. 모든 것이 잘 작동하는 것 같습니다. 파일은 유효합니다. 예 : Adobe Reader는 아무 문제도보고하지 않으며 서명을 유효한 것으로 표시합니다.부호가있는 PDF 파일에서 Byte Order Mark를 제거 하시겠습니까?

문제는 Java 클라이언트가 분명히 파일에 문제가 있다는 것입니다. 파일을 열거 나 구문 분석 할 수 없습니다.
파일의 헤더에 바이트 순서 표시가있어서 동작을 일으키는 것으로 보입니다 (\ x00EF \ x00BB \ x00BF).

나는이 같은 BOM 식별 할 수 :

PdfReader reader = new PdfReader(path); 
byte[] metadata = reader.Metadata; 
// metadata[0], metadata[1], metadata[2] contain the BOM 

어떻게 (서명의 유효성을 잃지 않고) BOM을 제거 할 수 있습니다 중 하나를, 또는 파일로이 바이트를 추가하지 iTextSharp 라이브러리를 강제로?

+0

방금 ​​확인한 바 iTextSharp는 자체적으로 BOM을 추가하지 않습니다. 원본 PDF에는 서명하기 전에 PDF가 있거나 BOM을 추가하는 것이 있습니다. – divanov

+0

메타 데이터 (PDF 파일의 어딘가에 임베드 됨)에는 일반적으로 BOM이 있으며 정상입니다. * 문제는 자바 클라이언트가 분명히 그 파일들에 문제가있는 것입니다 - 어떤 자바 클라이언트입니까? – mkl

+0

@mkl : 먼저 InputStream이 바이트 배열을 읽으면 xml을 파싱 할 때 XMLPullParse (android)가 XmlPullParserException을 던집니다. BOMInputStream을 사용하면 String에서 BOM을 제거하므로 XMLPullParser는 어쨌든 읽을 수 있습니다. 하지만 제 요구 사항은 BOM이없는 원본 파일을 갖는 것입니다. – lukasz

답변

6

중요한 것부터 먼저 주말 : 이상 업데이 트를 게시 할 예정입니다 ... 다시 그것을 추가 할 수 있습니다 서명하면 무효화됩니다.

두 번째 관찰 : 바이트 순서 표시는 이 아니며이 아닙니다 (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가 나타날 수 있습니다.

+0

* 두 번째 관찰 : 바이트 순서 표시는 헤더의 일부가 아닙니다. 그것은 begin 속성의 값입니다 * - 그것이 어떻게되어야하는지입니다. 그러나 OP의 샘플 서명되고 암호화 된 파일이 실제로 BOM을 가지고 있다고 회상하면 [여기] (http://i.stack.imgur.com/nrj3t.png)를 참조하십시오. (실제로 그 문제를 조사하고 싶었지만 문제를 놓쳤습니다.) – mkl

+0

의미 : PDF 머리글의 일부가 아닙니다. PDF 헤더는 다음과 같습니다 :'% PDF-1.'. 나는 분명히 할 것이다. –

+0

질문을 다시 읽었습니다. 그것은 모호하다. BOM은 * file *의 헤더 부분에 포함되어 있지만이 예는 사실이 아니라는 것을 보여줍니다. BOM은 XMP 메타 데이터에서 발견됩니다. XMP 메타 데이터는 PDF 파일 내부 스트림으로 래핑됩니다. –

1

빠른 접근 :

먼저 두 파일을 암호화되지 않은 상태로 저장하십시오. 두 번째 : 파일을 저장하기 전에 0에서 2까지의 메타 데이터를 제거하십시오.

그러나 몇 가지 고려 사항이 있습니다. 서명 방법에 BOM이 필요합니까? 암호화 방법에 BOM이 필요합니까?

또한 BOM을 제거 할 수 있는지 여부를 결정하기 전에 BOM이 추가 된 단계를 확인해야합니다.

내 pdf 구조체 워드 프로세서에 대한 간단한 검색을하고, 가장 간단한 방법은 바이트 배열로 모든 것을로드하고 파일의 시작 부분에서 단순히 제거하는 것입니다. 그런 다음 서명/암호화를 수행하십시오. PDF 파일이 체결되면, 당신이 있기 때문에, 그 PDF의 바이트를 변경하지 마십시오 : 그러나 그들은

나는

관련 문제