我正在学习手写Postscript。我从下面的链接中获取了一个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',它识别PDF包含一个JBIG2图像流,但它仍然没有尽可能地呈现它。
./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)
我注意到这个堆栈溢出帖子指出不应该包含魔术头,我现在在上面的例子中。
jbig2 data in pdf is not valid jbig2 data. Wrong magic
无论是否有JBIG2流中的8字节标题,都不会打印错误,也不会呈现图像。
非常感谢任何想法。
答案 0 :(得分:1)
只是为了更进一步。您的Page
对象缺少Contents
条目。来自PDF ISO 32000表30页面对象中的条目:
内容|流或数组(可选)|一个内容流(见7.8.2,“内容流”),它将描述该页面的内容。如果此条目不存在,则页面应为空。
这解释了文档呈现为空页的原因。内容包含实际呈现页面的说明,如Chapter 8 - Graphics
中所述内容流至少可能包含两条指令:
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
条目添加到现有的Page对象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流中的数据仍然存在问题。