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:我这样做是因为我对格式本身很感兴趣,并且想从小脚本中生成一些自动生成的文档。此外,我可能会将它们嵌入到一个弱功率设备中,我无法承受依赖数十兆字节的依赖项。
但在此之前,我仍然尝试过这样做,使用 PHP 和 TCPDF。如果已经有一些我会错过的专门用于此的设施,这也与我的兴趣相关。 :-)
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 节。
我目前在不使用外部库的情况下生成 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:我这样做是因为我对格式本身很感兴趣,并且想从小脚本中生成一些自动生成的文档。此外,我可能会将它们嵌入到一个弱功率设备中,我无法承受依赖数十兆字节的依赖项。
但在此之前,我仍然尝试过这样做,使用 PHP 和 TCPDF。如果已经有一些我会错过的专门用于此的设施,这也与我的兴趣相关。 :-)
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 节。