5

Adobe Forums: Simple Text String Example in specificationの投稿が壊れているのを見つけました。だったので、プレーンテキストのソース コードの PDF の例を探すことに興味を持ちました。

そのため、その投稿を通じて、最終的に次のことがわかりました。

PDF 1.7 仕様には、699 ページの付録「_Annex H (参考) サンプル PDF ファイル」があります。そこから、「H.3 シンプル テキスト文字列の例」(「クラシックな Hello World」) を試してみたいと思いました。

そこで、これを次のように保存しようとしましたhello.pdf(_PDF32000_2008.pdf からコピーする場合を除き、" %PDF-1. 4" が表示される場合があります。つまり、 の後にスペースが挿入され1.ます。これは削除する必要があります_):

%PDF-1.4
1 0 obj
  << /Type /Catalog
      /Outlines 2 0 R
      /Pages 3 0 R
  >>
endobj

2 0 obj
  << /Type /Outlines
      /Count 0
  >>
endobj

3 0 obj
  << /Type /Pages
      /Kids [ 4 0 R ]
      /Count 1
  >>
endobj

4 0 obj
  << /Type /Page
      /Parent 3 0 R
      /MediaBox [ 0 0 612 792 ]
      /Contents 5 0 R
      /Resources << /ProcSet 6 0 R
      /Font << /F1 7 0 R >>
  >>
>>
endobj

5 0 obj
  << /Length 73 >>
stream
  BT
    /F1 24 Tf
    100 100 Td
    ( Hello World ) Tj
  ET
endstream
endobj

...そして私はそれを開こうとしています:

evince hello.pdf

...しかし、エビデンスはそれを開くことができません:「ドキュメントを開くことができません/PDFドキュメントが破損しています」; また:

Error: PDF file is damaged - attempting to reconstruct xref table...
Error: Couldn't find trailer dictionary
Error: Couldn't read xref table

私もチェックしqpdfます:

$ qpdf --check hello.pdf
WARNING: hello.pdf: file is damaged
WARNING: hello.pdf: can't find startxref
WARNING: hello.pdf: Attempting to reconstruct cross-reference table
hello.pdf: unable to find trailer dictionary while recovering damaged file

これのどこが間違っているのですか?

ご回答ありがとうございます。
乾杯!

4

2 に答える 2

2

ファイルの最後に(構文的に正しい)セクションをxref追加する必要があります。trailerつまり、バイトオフセットが正しく記述されていない場合でも、PDFの各オブジェクトには外部参照テーブルに1行が必要です。次に、Ghostscript、pdftk、またはqpdfは、正しい外部参照を再確立してファイルをレンダリングできます。

[...]
endobj
xref 
0 8 
0000000000 65535 f 
0000000010 00000 n 
0000000020 00000 n 
0000000030 00000 n 
0000000040 00000 n 
0000000050 00000 n 
0000000060 00000 n 
0000000070 00000 n 
trailer 
<</Size 8/Root 1 0 R>> 
startxref 
555 
%%EOF 
于 2012-06-07T13:03:17.227 に答える
2

なんてこった - コードの一部だけをコピーしただけです。OP コードは pg 701 のものです - 次に、私を混乱させたフッターがあります。それ以外の場合、コードは pg 702 に続きます:/

編集:同様のより詳細な例については、PDFの紹介-GNUpdfアーカイブ)も参照してください)

したがって、完全なコードは次のとおりです。

%PDF-1.4
1 0 obj
  << /Type /Catalog
      /Outlines 2 0 R
      /Pages 3 0 R
  >>
endobj

2 0 obj
  << /Type /Outlines
      /Count 0
  >>
endobj

3 0 obj
  << /Type /Pages
      /Kids [ 4 0 R ]
      /Count 1
  >>
endobj

4 0 obj
  << /Type /Page
      /Parent 3 0 R
      /MediaBox [ 0 0 612 792 ]
      /Contents 5 0 R
      /Resources << /ProcSet 6 0 R
      /Font << /F1 7 0 R >>
  >>
>>
endobj

5 0 obj
  << /Length 73 >>
stream
  BT
    /F1 24 Tf
    100 100 Td
    ( Hello World ) Tj
  ET
endstream
endobj

6 0 obj
  [ /PDF /Text ]
endobj

7 0 obj
  << /Type /Font
    /Subtype /Type1
    /Name /F1
    /BaseFont /Helvetica
    /Encoding /MacRomanEncoding
  >>
endobj

xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000364 00000 n
0000000466 00000 n
0000000496 00000 n

trailer
  << /Size 8
    /Root 1 0 R
  >>
startxref
625
%%EOF

実際、エラー メッセージが示していたように、xref セクションありませんでした。

しかし、これで終わりではありませんevince

$ evince hello.pdf 
Error: PDF file is damaged - attempting to reconstruct xref table...

...そしてそうなりますqpdf

$ qpdf --check hello.pdf
WARNING: hello.pdf: file is damaged
WARNING: hello.pdf (file position 625): xref not found
WARNING: hello.pdf: Attempting to reconstruct cross-reference table
checking hello.pdf
PDF Version: 1.4
File is not encrypted
File is not linearized
WARNING: hello.pdf (object 5 0, file position 436): attempting to recover stream length

したがって、実際に適切な例を取得するには、Adobe Forums: Simple Text String Example in specification が壊れています。指摘、xref テーブルを再構築する必要があります (正しいバイト オフセットを持つ)。

これを行うために、「 PDF の破損した XREF テーブルとストリームの長さを修復する (可能な場合)」を使用pdftkできます

$ pdftk hello.pdf output hello_repair.pdf

...そして問題なくhello_repair.pdf開き、次のように報告します:evinceqpdf

$ qpdf --check hello_repair.pdf
checking hello_repair.pdf
PDF Version: 1.4
File is not encrypted
File is not linearized
No errors found

さて、これが誰かに役立つことを願っています、
乾杯!

于 2012-06-07T12:53:09.103 に答える