PDF:添加图像流(自制API)

问题描述 投票:0回答:1

我目前正在使用 ISO SPEC 从头开始为 PDF 创建工具制作自己的 API。目的是通过代码创建一些 PDF。到目前为止一切进展顺利。我可以创建页面、文本、框……我需要实现的最后一件事是添加一些图像的可能性。这是我到目前为止所得到的:

%PDF-1.7
1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj
2 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj
3 0 obj << /Length 37 >> stream
q 403 0 0 115 36 200 cm /Im1 Do Q
endstream endobj
4 0 obj << /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 3 0 R /Resources << /XObject << /Im1 5 0 R >> >> >> endobj
5 0 obj << /ColorSpace /DeviceRGB /Height 115 /Subtype /Image /Type /XObject /Width 403 /BitsPerComponent 8 /Length 14079 >> 
stream

....[图像流]....

endstream endobj
xref
0 6
0000000000 65535 f
0000000010 00000 n
0000000060 00000 n
0000000120 00000 n
0000000206 00000 n
0000000337 00000 n
trailer
<< /Size 6 /Root 1 0 R >>
startxref
14567
%%EOF

在检查了一些现有的 PDF 文档后,我很确定这已经接近工作了。但是,AcrobatReader 无法打开我的文档,用 Edge 打开它会显示该文档,但图像很奇怪。 对于流本身,我使用:

Dim byteStream As Byte() = IO.File.ReadAllBytes("C:\Users\---------------\Images\test.JFIF")
Then -> $"stream {Encoding.ASCII.GetString(byteStream)} endstream"

显然我在这里遗漏了一些东西。有人有任何提示吗? 谢谢您和亲切的问候, FINET L.

规格、互联网、论坛、..

pdf
1个回答
0
投票

程序失败是因为缺少解码参数。

图像周围的所有指令将在运行时支持

的图像窗口

X = 403 x Y = 115(46345 像素)

图像被定义为渲染为简单的 RGB,因此运行时字节数,未压缩时为 139035 字节。

但是资源被声明为

/Length 14079
清楚地表明压缩。

您在问题中指出了一个 jfif 标签,因此应该使用 DCT 压缩, 但你还没有使用过那个标志!!

如果使用未压缩的 BLOB,它将如下所示 enter image description here

6 0 obj <</BitsPerComponent 8/ColorSpace/DeviceRGB/Width 3/Height 3/Length  27/Subtype/Image>>
stream
ÿ   ÿ   ÿ ÿÿÿ ÿÿÿ    ÿÿÿ   
endstream
endobj

作为更大的 Jpeg 压缩图像,其大小将远大于 27 字节,但小于任何其他格式。上面的图像压缩为 JPEG = 5,235 字节。

被看起来像这样劣质 4083 字节的库降级。这就是为什么我手动(或使用计算机辅助)将其写为上面只有 27 个像素完美字符的原因。

6 0 obj
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter/DCTDecode/Height 147/Length 4083/Subtype/Image/Type/XObject/Width 147>>stream
ÿØÿà JFIF  ` `  ÿÛ C ...etc...

回答

添加最小的压缩 JPEG 图像时,需要首先将其声明为:

/Filter/DCTDecode/Type/XObject
© www.soinside.com 2019 - 2024. All rights reserved.