pdfs是如何构建的



在哪里可以找到关于pdf是如何组成的信息?例如:我创建了一个名为Dokname的pdf,其中包含在文本编辑器中打开的字符串TEST,如下所示:(我用〔…〕替换了文本编辑器无法解码的部分(

%PDF-1.4
%Óëéá
1 0 obj
<</Title (Dokname)
/Producer (Skia/PDF m102 Google Docs Renderer)>>
endobj
3 0 obj
<</ca 1
/BM /Normal>>
endobj
5 0 obj
<</Filter /FlateDecode
/Length 160>> stream
[...]
endstream
endobj
2 0 obj
<</Type /Page
/Resources <</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <</G3 3 0 R>>
/Font <</F4 4 0 R>>>>
/MediaBox [0 0 596 842]
/Contents 5 0 R
/StructParents 0
/Parent 6 0 R>>
endobj
6 0 obj
<</Type /Pages
/Count 1
/Kids [2 0 R]>>
endobj
7 0 obj
<</Type /Catalog
/Pages 6 0 R>>
endobj
8 0 obj
<</Length1 14972
/Filter /FlateDecode
/Length 7164>> stream
[...]
endstream
endobj
9 0 obj
<</Type /FontDescriptor
/FontName /AAAAAA+ArialMT
/Flags 4
/Ascent 905.27344
/Descent -211.91406
/StemV 45.898438
/CapHeight 715.82031
/ItalicAngle 0
/FontBBox [-664.55078 -324.70703 2000 1005.85938]
/FontFile2 8 0 R>>
endobj
10 0 obj
<</Type /Font
/FontDescriptor 9 0 R
/BaseFont /AAAAAA+ArialMT
/Subtype /CIDFontType2
/CIDToGIDMap /Identity
/CIDSystemInfo <</Registry (Adobe)
/Ordering (Identity)
/Supplement 0>>
/W [0 [750] 40 54 666.99219 55 [610.83984]]
/DW 0>>
endobj
11 0 obj
<</Filter /FlateDecode
/Length 243>> stream
[...]
endstream
endobj
4 0 obj
<</Type /Font
/Subtype /Type0
/BaseFont /AAAAAA+ArialMT
/Encoding /Identity-H
/DescendantFonts [10 0 R]
/ToUnicode 11 0 R>>
endobj
xref
0 12
0000000000 65535 f 
0000000015 00000 n 
0000000365 00000 n 
0000000098 00000 n 
0000008721 00000 n 
0000000135 00000 n 
0000000573 00000 n 
0000000628 00000 n 
0000000675 00000 n 
0000007925 00000 n 
0000008159 00000 n 
0000008407 00000 n 
trailer
<</Size 12
/Root 7 0 R
/Info 1 0 R>>
startxref
8860
%%EOF

这些obj-元素代表什么?我的TEST在哪里?为什么它被搅乱了?

我正在搜索的内容可能都可以在adobe的文档中找到,但这些文档有数百页,非常庞大。我知道这是一个非常复杂的话题,我并没有试图完全理解它。只是想找一个介绍或概述。不幸的是,我在youtube或其他地方没有找到这样的东西。。

对于注释来说太复杂了,是的,你只会在这里和那里找到一些片段,包括我和其他人的答案中的this和bit。

为了快速概述您提供的代码示例

pdf是不按顺序放置的obj效果的集合。因此,您从最后%%EOF(可能是多个EOF中的一个!(之前的末尾开始使用startxref 8860,其中8860是交叉(XRef(会议表的十进制地址,即文件索引。

有很多缩写(太多了,无法列出(,与堆栈语言一样,大多数内容可能(从字面上(向后显示,因此外部参照指向文件中的每个对象位置。

在这种情况下,主要目标是7 0 obj <</Type /Catalog /Pages 6 0 R>> endobj,因为目录告诉我们在对象6/Pages /Count 1 /Kids [2 0 R]中可以找到后续页面的数量,所以它的一个页面在2 0 obj 中进一步定义

我们现在看到,在/MediaBox[0 0 596 842]中放置了一个图像和字体;接近210毫米。

关于这一项的描述太多了,所以跳到你的文本在哪里,我们看到/Contents 5 0 R,因此您需要解码的压缩数据流很可能是您的文本,但长度(/length 160(是二进制扁平编码流,其位置不仅仅是原始纯文本。

日期子设置字体的数量似乎很奇怪,仅4个字母就过多了(如果它是类似的Helvetica,则不需要像CID ArialMT那样包含或破坏字体(,如果没有完整的文件,很难说为什么会有单词/Image*,但它是Google Docs Renderer!

我的怀疑是,我们可能会在该流中看到OCR的特征。

最新更新