2010-12-29 1 views
4

PDF 파서/라이터를 개발 중이지만 상호 참조 스트림을 생성하는 데 어려움이 있습니다. 내 프로그램에서 this 파일을 읽은 다음 선형화를 제거하고 개체 스트림의 모든 개체의 압축을 풉니 다. 마지막으로 PDF 파일을 만들고 저장합니다.PDF 크로스 레퍼런스 스트림

정상 교차 참조 & 예고편을 사용하면 this 파일에서 볼 수있는 것처럼 정상적으로 작동합니다. 내가 대신 (this 파일에서 발생하는 상호 참조 스트림 객체를 생성 할 때

, Adobe Reader가

은 PDF의와 사람의 경험을 가지고 있습니다. 그것을 볼 수없는 날이 문제는?

무엇인지 검색 할 수 있습니다 상호 참조 파일 2 및 파일 3 제 34,127 바이트가 동일한 유일한 차이가 있음

참고.

사람 디코딩 기준 스트림의 콘텐츠를 필요로한다면

, this 파일을 다운로드하고, 그것을 열 HEX 편집기.이 참조 테이블 agai를 확인했습니다. n과 다시 그러나 나는 틀린 무엇이라도 발견 할 수 없었다. 그러나 사전도 괜찮을 것 같습니다.

도움 주셔서 감사합니다.

업데이트

지금은 문제를 완전히 해결했습니다. 새 PDF here을 찾을 수 있습니다.

답변

6

두 문제.

  1. "크기 정수 (필수)이 절에서 나에 대한 모든 부분에 사용되는 가장 높은 개체 수보다 큰 수 하나 어떤이는 갱신되어야한다. 그것은 트레일러 사전의 크기 항목에 해당한다. "

    당신의 크기를해야한다 ... (14)

  2. "색인 array (선택 사항)이 섹션의 각 하위 섹션에 대한 정수 쌍을 포함하는 배열입니다.첫 번째 정수는 하위 섹션의 첫 번째 객체 번호입니다. 두 번째 정수는 하위 섹션에있는 항목의 수입니다. 배열은 객체 번호에 따라 오름차순으로 정렬됩니다. 하위 섹션은 겹칠 수 없습니다. 오브젝트 번호는 섹션에 최대 하나의 항목 만 가질 수 있습니다. 기본 값 : [0 크기] "

    아마 조금 주위를 건너 뛰어야 귀하의 인덱스 당신은 2-4 또는 7. 인덱스 배열이를 반영 할 필요가있는 물체가없는

  3. 귀하의 데이터 아인 '... t 오른쪽 중 하나 (난 그냥 외부 참조 스트림을 읽어 밖으로 배웠습니다. 저를 야호.)


00 00 00
01 00 0a
01 00 47
01 01 01
01 01 70
01 02 fd
01 76 f1
01 84 6b
01 84 a1
01 85 4f

당신의 "아니오 지수"의 때문에 개체 번호 0으로 해석이 데이터에 따르면, 9 시까 지 ng 오프셋 :

0은 사용되지 않습니다. 벌금.
1은 0x0a에 있습니다. 그래, 물론
2는 0x47에 있습니다. 아니. 그 토지는 "1 0"의 시작 부분 근처에있다. 이것은 아마도 우연이 아닙니다.
3은 0x101에 있습니다. 아니. 0x101은 여전히 ​​"1 0"의 스트림 내에 있습니다.
4는 0x170에 있습니다. Ditto
5는 0x2fd에 있습니다. Ditto
6은 0x76f1에 있습니다. 아니,이 시간은 그 이미지의 흐름 속에 묻혔다.

나는 생각합니다. 따라서 올바른 \ 인덱스가 있더라도 오프셋은 모두 잘못되었습니다 (결과는 decom-hex 혼동을 허용하는 resultNormal.pdf와 완전히 다릅니다). 당신이 원하는 무엇

은 resultNormal의 외부 참조에서 찾을 수 있습니다 : (나는이 권리를 읽고 있어요 경우)

xref
0 2
0000000000 65535 f
0000000010 00000 n
5 2
0000003460 00000 n
0000003514 00000 n
8 5
0000003688 00000 n
0000003749 00000 n
0000003935 00000 n
0000004046 00000 n
0000004443 00000 n

그래서 색인이 있어야한다 : \ 인덱스 [0 2 5 2 8 5]. 그리고 데이터 :
0 0 0
1 0
(1) 3460 (그건 진수)
1 3514 (상동)
1 3688
등이

흥미롭게도, PDF 스펙은 크기가해야 말한다 이 값과 모든 이전 XRef의 항목 수와 사용중인 가장 높은 오브젝트 수보다 1 위 높은 값이어야합니다.

나중에 부분이 적용되지는 않겠지 만 외부 참조 스트림이 일반 상호 참조 테이블보다 유지력이 높다는 사실을 알면 놀랄 것입니다. 두 코드를 모두 처리하는 코드가 같을 수도 있습니다.


@mtraut :

여기 내가 볼 수있는 작업은 다음과 같습니다

13 0 OBJ
<</Size 10/Length 44/Filter /FlateDecode/DecodeParms <</Columns 3/Predictor 12>>/W [1 2 0]/Type /XRef/Root 8 0 R>>
스트림
...
endstream
endobj는

+0

정말 고마워요 !!! 나는 그것이/Index 태그를 가진 것이라고 생각한다. 그것은 선택 사항이므로 무시했습니다. 그러나 내 객체가 0에서 9가 아니기 때문에 필요합니다. –

+0

이제 암호화없이 참조 스트림을 저장하고/Index 배열을 사전에 추가했습니다. 이제는 훌륭하게 작동합니다! 정말 고마워!! –

+0

알아요. 알아요. 나는 * 바위 *. 그리고 나는 너무 겸손한 슈퍼! 그리고 좋은 찾고. "잘 생긴"것을 잊지 맙시다. ... 제 말은 ... 당신은 환영합니다. –

0

"resultstream.pdf"에는 유효한 교차 참조 스트림이 없습니다.

내 뷰어에서 열면 객체 "13 0"을 교차 참조 스트림으로 읽으려고하지만 일반 사전 (스트림 태그 및 데이터가 없음)을 읽으려고합니다.

주제 조금 외 : 어떤 언어로 개발하고 있습니까? 적어도 Java에서는 세 가지 중요한 선택 사항 (PDFBox, iText 및 jPod, 개인적으로 개발자 중 한 명이 jPod를 선택하고 매우 구현이 간편함 :-)을 알고 있습니다. 이것이 당신의 플랫폼에 맞지 않는다면, 적어도 알고리즘과 데이터 구조를 살펴볼 수 있습니다.

편집

음 - "resultstream.pdf는"문제의 문서 인 경우 다음이 내 편집기 (SCITE가)

... 
13 0 obj 
<</Size 0/W [1 2 0]/Type /XRef/Root 8 0 R>> 
endobj 
startxref 
34127 
%%EOF 

더 스트림이 없습니다 보는 것입니다. 내가 스트림 데이터 자체를 보지 않고 (참조

+0

나는 그게 문제라고 생각하지 않습니다. 나는 메모장에 "stream .... endstream"을 본다. 뷰어에 문제가 있습니까? –

+0

위의 편집보기 | – mtraut

+0

SciTE는 텍스트 편집기 (오른쪽?)이므로 문제가되지 않습니다. 일부 뷰어 앱에서 PDF를 연 다음 링크에서 직접 저장하지 않고 PDF를 저장했다고 추측 할 것입니다. 항상 링크에서 저장하십시오. 알려진 PDF를 다룰 때는 특히주의해야합니다. 시청자는 파일을 수정하려고하므로 저장하는 버전이로드 한 버전과 상당히 다를 수 있습니다. –