PDF生成——如何合并多个流对象?

PDF generation — How to merge multiple stream objects?

我目前在不使用外部库的情况下生成 PDF 文档,到目前为止进展顺利。我已经使用文本编辑器 (vim) 编写了下面公开的文档,它使用至少两个不同的 PDF 查看器 (evince & gsview, 运行 Linux).

此文档在页面顶部生成三个方块,具有不同的大小、宽度和颜色。

我的问题是:有没有办法将两个流对象合并成一个新的流对象,或者换句话说,有没有办法从简单的开始组合复杂的对象一个,所以我们可以很容易地引用这些复合对象,如果需要的话可以多次引用?

在给定的示例中,对象 5 0 obj 正在绘制一个正方形,后面的只是应用颜色和坐标变换(通过矩阵)。

PDF 参考手册指出,作为数组传递给页面对象 /Contents 参数的多个流内容被连接起来并作为单个连续流进行处理,这完全可以解决问题……只要文档保持较小简单!

在同一个示例中,/Contents 数组间接传递给对象 4 0 obj,对象 4 0 obj 引用了三次 5 0 R,以绘制正方形。

这里的理想情况是定义三个不同的对象,每个对象都自己引用 5 0 R,然后仅从 Contents 数组中调用这些对象,每次调用一次。

我尝试在其中添加子数组,这又可以嵌入到专用对象中并间接引用,但不幸的是它不起作用。 :-(

非常感谢 could/try-to 帮助过的人!

PS:我这样做是因为我对格式本身很感兴趣,并且想从小脚本中生成一些自动生成的文档。此外,我可能会将它们嵌入到一个弱功率设备中,我无法承受依赖数十兆字节的依赖项。

但在此之前,我仍然尝试过这样做,使用 PHPTCPDF。如果已经有一些我会错过的专门用于此的设施,这也与我的兴趣相关。 :-)


Small.pdf(手工制作的PDF文件)

%PDF-1.7

1 0 obj
<<
    /Type       /Catalog
    /Pages      2 0 R
>>
endobj

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

3 0 obj
<<
    /Type       /Page
    /MediaBox   [ 0.000000 0.000000 1000.000000 1414.213562 ]
    /Contents   4 0 R
>>
endobj

4 0 obj
% A simple array, just to avoid embedding it directly in /Page object (3 0 R here)
[
    6 0 R   5 0 R   % Red   square
    7 0 R   5 0 R   % Green square
    8 0 R   5 0 R   % Blue  square (tilted)
]
endobj

5 0 obj
% Draws a square, centered by default on lower left corner
<<
    /Length     43
>>
stream
+20 +20 m
+20 -20 l
-20 -20 l
-20 +20 l s Q
endstream
endobj

6 0 obj
<<
    /Length     63
>>
stream
/DeviceRGB CS
q
1.0 0.0 0.0 SC
2.0 w
1 0 0 -1 60 1354.213562 cm
endstream
endobj

7 0 obj
<<
    /Length     49
>>
stream
q
0.0 1.0 0.0 SC
1.0 w
2 0 0 -2 190 1334.213562 cm
endstream
endobj

8 0 obj
<<
    /Length     83
>>
stream
q
0.0 0.0 1.0 SC
5.0 w
0.707106781 0.707106781 -0.707106781 0.707106781 110 1250 cm
endstream
endobj

xref
0 9
0000000000 65535 f
0000000010 00000 n
0000000079 00000 n
0000000168 00000 n
0000000296 00000 n
0000000513 00000 n
0000000674 00000 n
0000000796 00000 n
0000000905 00000 n
trailer
<<
    /Size       9
    /Root       1 0 R
    /ID         [ <0000000000> <0000000001> ]
>>
startxref
01047
%%EOF

您要查找的是 XObjects 表单。

pdf 规范 ISO 32000-1 是这样描述它们的:

A form XObject is a PDF content stream that is a self-contained description of any sequence of graphics objects. A form XObject may be painted multiple times - either on several pages or at several locations on the same page - and produces the same results each time, subject only to the graphics state at the time it is invoked.

有关详细信息,请阅读规范的第 8.10 节。