2014-02-24 3 views
1

나는 PDF를 생성하여 데이터베이스에 저장하고 있습니다.iTextSharp는 2 개의 PDF가 동일한 지 비교합니다.

PDF를 데이터는 이미 데이터베이스에 존재하고, 2 base64strings 비교 똑같은 PDF를 생성 할 경우, 그들은하지 있습니다

Convert.ToBase64String (pdf.ByteArray)를 사용하여 텍스트 필드에 저장됩니다 같은. 큰 부분은 동일하지만 텍스트의 약 5-10 %가 매번 다른 것으로 보입니다.

둘 다 동일한 방법을 사용하여 생성 된 경우 두 개의 pdfs가 서로 다른 것으로 나타납니다.

마지막으로 db에 저장된 이후 PDF가 수정되었는지 알 수 없기 때문에이 문제가 발생합니다.

편집 : 실제 PDF를 볼 때 2 PDF를 시각적으로 똑같은 나타나지만 바이트 base64string은 는 동일한 시각 미만 완전히 다를 수 100 %를 보이는 것을

답변

3

두 PDF를 다른 표지. PDF 제작 프로그램은 "hello"라는 단어를 한 단어로 쓰거나 임의의 순서로 쓰여진 다섯 개의 개별 편지로 자유롭게 쓸 수 있습니다. 또한 테이블의 선을 먼저 그려서 셀 내용 또는 셀 내용을 먼저 그리거나 한 번에 하나의 셀과 같은 이들을 조합 할 수 있습니다.

는 실제로 프로그래밍 PDF를 작성하는 경우 당신은 당신이 여전히 100 % 동일한 파일을받지 않습니다 완전히 동일한 코드를 사용하여 두 개의 PDF 파일을 만들 수 있습니다. 이에 대한 몇 가지 이유가 있습니다. 가장 명백한 것은 PDF가 생성 및 수정 날짜를 지원한다는 것입니다. 이들은 언제 생성되는지에 따라 분명히 바뀔 것입니다. 이 같은 것을 사용하여 (그래서이 사용하지 않는 것이 좋습니다 및 다른 사람을 혼동)이를 재정의 할 수

var info = writer.Info; 
info.Put(PdfName.CREATIONDATE, new PdfDate(new DateTime(2001,01,01))); 
info.Put(PdfName.MODDATE, new PdfDate(new DateTime(2001,01,01))); 

그러나, PDF 파일도 트레일러의 /ID 항목의 고유 한 식별자를 지원합니다. 필자가 알고있는 한, iText는이 매개 변수를 무시하는 것을 지원하지 않습니다. PDF를 복제하고이를 수동으로 변경 한 다음 차이를 계산하면 비교에 더 가까워 질 수 있습니다.

글꼴이 있습니다. 글꼴을 서브 세트 할 때, 제작자는 원래 이름과 여섯 개의 대문자 ASCII 문자를 임의로 선택하여 고유 한 내부 이름을 작성합니다. 따라서 Calibri 글꼴의 경우 글꼴 이름은 JLXWHD+Calibri이고 다른 시간은 SDGDJT+Calibri 일 수 있습니다. iText는 당신이 아마 이익보다 해를 입기 때문에 이것을 무시하는 것을 지원하지 않습니다. 이러한 내부 이름은 글꼴 하위 집합 충돌을 방지하는 데 사용됩니다.

즉, 서로의 물리적 인 중복 파일 두 개를 비교하지 않으면 바이너리 내용을 직접 비교할 수 없습니다. 긴 대답은 PDF 항목 중 일부를 수정하여 만 비교할 수 있지만이라는 고유 한 부분을 제거 할 수 있지만 파일을 데이터베이스에 다시 저장하는 것보다 더 많은 작업을 수행 할 수 있습니다.

+0

좋은 답변입니다. 동일한 소스 코드를 사용하여 작성된 PDF 라하더라도 각 PDF는 고유 한 파일 형식입니다. PDF에 대한 비교 방법에 대한 자세한 내용은 테스트에 관한 다음 질문에 대한 내 대답을 읽어보십시오. http://stackoverflow.com/questions/21944424/itext-unit-testing-and-automated-testing-questions –

+0

뛰어난 응답. 일부 숨겨진 정보 (타임 스탬프)가 차이점의 원인이라고 생각했습니다. 궁극적으로 필자는 pdf에서 텍스트를 가져와 내 방식대로 비교하는 방법을 찾았습니다.아마도 가장 효율적인 방법은 아니지만 작동합니다. – mrb398

관련 문제