I just found the post Adobe Forums: Simple Text String Example in specification broken., so I got interested in finding plain-text source code PDF examples.
So, through that post, I eventually found:
- The webpage PDF Reference and Adobe Extensions to the PDF Specification | Adobe Developer Connection ; which contains:
The PDF 1.7 spec has on page 699 appendix "_Annex H (informative) Example PDF files"; and from there, I wanted to try "H.3 Simple Text String Example" (the "classic Hello World").
So I tried to save this as hello.pdf
(_except note when you copy from the PDF32000_2008.pdf, you may get "%PDF-1. 4
" - that is, a space inserted after 1.
, which must be removed_) :
%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
... and I'm trying to open it:
evince hello.pdf
... however, evince cannot open it: "Unable to open document / PDF document is damaged"; and also:
Error: PDF file is damaged - attempting to reconstruct xref table...
Error: Couldn't find trailer dictionary
Error: Couldn't read xref table
I also check with 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
Where am I going wrong with this?
Many thanks in advance for any answers,
Cheers!
You should append a (syntactically correct)
xref
andtrailer
section to the end of the file. That means: each object in your PDF needs one line in the xref table, even if the byte offset isn't correctly stated. Then Ghostscript, pdftk or qpdf can re-establish a correct xref and render the file:Ah damn it - I had copied just a part of the code; the OP code is the one on pg 701 - then there is a footer which confused me; otherwise the code continues on pg 702
:/
(EDIT: also see Introduction to PDF - GNUpdf (archive) for a similar, more detailed example)
So here is the complete code:
Indeed, as the error messages were saying, xref section was missing!
However, this is still not the end - while this document will open in
evince
, evince will still complain:... and so will
qpdf
:So to actually get a proper example, as the Adobe Forums: Simple Text String Example in specification broken. points out, xref table needs to be reconstructed (have correct byte offsets).
And in order to do this, we can use
pdftk
to "Repair a PDF's Corrupted XREF Table and Stream Lengths (If Possible)":... and now
hello_repair.pdf
opens inevince
without a problem - andqpdf
reports:Well, hope this helps someone,
Cheers!