嵌入式 JBIG2 Postscript 流未呈现为 PDF

Embedded JBIG2 Postscript stream not being rendered in PDF

我正在学习手写后记。我从下面的 link 中获取了 JBIG2 图像(amb_1.jb2 在此处的示例中使用:http://jbig2dec.sourceforge.net/ubc/main.html)并将其添加到 PDF 文件内的流中.

有问题的 PDF 在这里。 https://gist.github.com/brandonprry/277cbbc581be4e8eaa403a16403a6996

在我尝试过的任何 PDF 阅读器中打开它都没有错误,但图像未呈现。

渲染嵌入式 JBIG2 图像流 (9 0 obj) 我缺少什么?使用 MuPDF 工具 'mutool info',它识别出包含 JBIG2 图像流的 PDF,但据我所知它仍然没有渲染它。

./mutool info /media/psf/Home/tmp/testcases/0adcc9f8-c421-47d6-93ad-9f6efc2e360b.pdf 
/media/psf/Home/tmp/testcases/0adcc9f8-c421-47d6-93ad-9f6efc2e360b.pdf:

PDF-1.4
Info object (3 0 R):
<</CreationDate(D:20051122152833-05'00')/Creator(PdfCompressor 3.0.84)/Producer(CVISION Technologies)>>
Pages: 1

Retrieving info from pages 1-1...
Mediaboxes (1):
    1   (7 0 R):    [ 0 0 967.68 1728 ]

Fonts (3):
    1   (7 0 R):    Type1 'Helvetica' (4 0 R)
    1   (7 0 R):    Type1 'Times-Roman' (5 0 R)
    1   (7 0 R):    Type1 'Courier' (6 0 R)

Images (1):
    1   (7 0 R):    [ ASCIIHex JBIG2 ] 10x10 1bpc DevGray (9 0 R)

我注意到这个堆栈溢出 post 指出魔术 header 不应该被包括在内,我目前在上面的例子中。

jbig2 data in pdf is not valid jbig2 data. Wrong magic

无论有无 JBIG2 流中的 8 字节 header,都不会打印任何错误,也不会呈现任何图像。

非常感谢任何想法。

让事情更进一步。您的 Page 对象缺少 Contents 条目。来自 PDF ISO 32000 Table 页面对象中的 30 个条目:

Contents | stream or array (Optional) | A content stream (see 7.8.2, "Content Streams") that shall describe the contents of this page. If this entry is absent, the page shall be empty.

这解释了文档呈现为空白页面的原因。内容包含实际呈现页面的说明,如 Chapter 8 - Graphics

中所述

至少,内容流可能包含两条指令:

A cm (Concat Matrix) 命令对图像进行任何缩放或平移。默认情况下,它将定位在 0, 0(左下角)并且图像将未缩放显示。

实际输出图像的Do命令。

这是一个内容流示例,它转换为 (x,y) = (50, 100),然后输出图像。

10 0 obj <<
  /Length 25
>> stream
1 0 0 1 50 100 cm
/I0 Do
endstream
endobj

/Length 是内容流的长度)。

这需要作为 /Contents 条目添加到现有页面对象 0 7 R

7 0 obj <<
  /Type /Page
  /Contents 10 0 R
  /MediaBox [ 0 0 967.68 1728 ]
  /Parent 1 0 R
  /Resources 8 0 R
>>
endobj

当然,您还需要调整 PDF 中的 xref 和尾部词典,以适应更改偏移和 10 0 R(内容流)作为新对象。

进行上述更改后,xpdf 出现以下错误:

Syntax Error (1224): Unknown segment type in JBIG2 stream
Syntax Error (34044): Unexpected EOF in JBIG2 stream

您需要处理的 JBIG2 流中的数据仍有问题。