现在的位置: 首页 > 综合 > 正文

说pdf的“层”

2014年01月06日 ⁄ 综合 ⁄ 共 4500字 ⁄ 字号 评论关闭

 

说pdf的

作者:马健
邮箱:stronghorse@tom.com
主页:http://stronghorse.yeah.net
发布日期:2007.01.10
最近更新:2007.02.20

目录
一、PDG中的层
二、PDF中的层
三、DjVu中的层

声明:本文仅为笔记的一部分,最多算备忘录,如果读的时候觉得无头无尾请不必惊讶。

PDG中的层

早期V1PDG文件结构中并没有层的描述字段,因此也没有分层不分层的说法:如果书籍页面上既有文字又有插图,则连文字带插图存储成一个大JPG。如果插图在页面上只占用很少一点面积,这样的存储方式当然很不经济:JPG并不适合存储黑白文字 。而如果能将文字与插图剥离开,文字用超星惯用的CCITT压缩存储,其压缩比要比JPG高很多,显示效果也会好很多。

这种文字与插图相区别的定义,从V2PDG文件结构开始出现:在主文件头中除主文字层的宽、高、数据长度等,还定义了插图的个数;在主文件头后顺序编列各插图的描述信息,包括:插图左上角点位置、插图高度、插图宽度、插图数据起始位置(相对文件起始位置的偏移量)、插图数据长度(字节数)等。

浏览器在绘制这种PDG时,先读取文字层数据(CCITT或黑白DjVu数据流),在背景上画出文字,然后逐个读取插图数据,读一个画一个。即从底往上,依次为背景(超星允许设置背景图案或背景颜色)层、文字层、第一张插图、第二张插图、……、第n张插图。

PDG所有插图均为矩形,数据流格式为24JPGDjVu,偶尔也会将JPGDjVu数据流封装成一个完整的PDG文件作为插图数据,这样就产生了所谓的嵌套PDG”:在一个PDG文件里,还包含一个或几个 PDG,每个子PDG都是一个插图。

理论上PDG文件的插图之间允许出现重叠,重叠时上层插图覆盖下层插图的重叠部分。但是在实际的PDG文件中,尚未见到重叠的情况,感觉超星找到了很好的方法,能够保证插图切割后的总面积最小,没有任何浪费。

PDF中的层

PDF中的层稍微复杂一些,我将其区分为狭义层广义层

所谓狭义层,指的是在Adobe出版发行的《PDF Reference fifth edition》第4.10节中定义的Optional Content(可选内容)。我称呼它为狭义层,是因为在Adobe Acrobat 7.0的界面、帮助里,都用层(layer这个词汇来明确称呼它。后面叙述的广义层就没有享受这样的待遇。

Optional Content定义的层,类似于Photoshop的概念,事实上Acrobat界面左侧窗口(排在书签窗口下面)的操作,也和Photoshop里的层操作差不多:点击眼睛图标,即可显示和隐藏指定的层。在同一个层上可以放置多个对象 (文本、图像、按钮等),隐藏、显示某层时,该层所有对象一起隐藏、显示。判断一个PDF文件是否采用Optional Content来定义层的方法也很简单:用Acrobat打开PDF文件,如果点开窗口能够看到内容,则该PDF肯定包含层,否则不包含。

我的同事在设计PDF表单时,喜欢在表单里用层来定义一些装饰性或提示性的元素,这些元素在打印时会隐藏。不过这几个家伙以前是做网页的,所以我一直怀疑他们是在HTML里用DIV用惯了,转到PDF来还是改不了老习惯 :) ,过一段时间自然会改用更简单的方法。我也曾在国学数典BBS上见 到有人用Adobe InDesign,做了一本用Optional Content定义的多层PDF:一层是扫描图像层,一层是文字层,还有一个附加层上放置了层选择按钮:点击文字层选择按钮,则隐藏图像层、显示文字层;点击图像层按钮则反之。不过可能这种书籍制作要求实在太高,用处又不大,我到现在也只见过这么一本。

通常大家说的双层PDF”,其实和用Optional Content定义的层一点关系都没有,所以用Acrobat打开以后,点窗口什么也看不到,即这种双层PDF”,其实不是Acrobat所认可的,只不过大家都这么说,而且从逻辑上来说确实有点的意思,所以我管这个叫广义层

这种广义的双层PDF”,底层是扫描图像层,上层是从扫描图像OCR出来的文字层,只不过文字设置为透明(在Foxit PDF Editor文本属性页中,文本模式没有填充和空心的文本(不可见),正常文字应为填充文本或其他)。这样通过PDF浏览器阅读的时候,看到的是底层原汁原味的扫描图像,各种公式、图表都和纸上看到的一样,但是搜索或用文字选取工具选取时,又可以直接对上层文字进行操作。因此这种PDF能够较好地避免纯扫描版不能检索,纯文字版排公式、表格困难的问题;同时兼有扫描版保持原文版式,纯文字版可以检索、复制/粘贴的优点。Adobe Acrobat 8就把能制作、转换这种双层PDF作为一大卖点加以介绍,虽然它的中文OCR引擎实在不怎么样。

这种双层PDF为了保证用文字选取工具选择文字时能够准确定位,通常要求严格实现字压图,即上层透明文字,要与底层图像上对应文字的大小、位置完全一样(当然真正完全一样是不可能的,只能尽量对准)。而版面上文字的间距、大小、字体可能变化多端,所以在生成PDF的时候,通常对每个字的位置进行单独描述,这就导致生成的结果基本上不可再校对、编辑。不信可以用Foxit PDF Editor打开一个生成好的双层PDF,用鼠标一个一个点过去,看是不是一次只能选一个中文字或一个字母、数字?对于这样的东西,我想就算是《大话西游》里的唐僧转世,校对上几页也会疯掉。

当然如果非校对不可,也不是没有办法,而且办法还不止一种。

如果错误不多,可以采用下面的方法:

1、用Acrobat或其他工具,将PDF中的文字信息全部导出成文本文件。
2
、用Foxit
PDF Editor
打开PDF
3
、在文本文件中看到错别字时,在Foxit PDF Editor里选中对应的字进行修改。
4
、改后别忘了存盘。

如果看了文本后感觉错误很多,则可以用下面的方法:

1、用Foxit PDF Editor打开PDF,进入需要修改的页面。
2
、先按Ctrl+A选择全部对象,然后按住Ctrl键,在页面空白处点一下鼠标左键,将背景图排除在选择之外,以确保选中的都是文字对象。
3
、在文本属性页中,将文本模式没有填充和空心的文本(不可见)改成填充文本,然后点更改
4
、现在看到文字显示出来了吧?不过缺省文字颜色一般是黑色,看起来费劲,可以保持文字选中状态,进入填充颜色页,改变颜色、透明度,然后点更改,将文字压缩和背景颜色区别开。
5
、现在就可以一个字、一个字地选中、修改了。改完后再按照步骤2选中全部文字,按照步骤3文本模式改回没有填充和空心的文本(不可见),存盘即可。

FreePic2Pdf在将多层PDG转换成PDF时,用的是与PDG浏览器绘制多层PDG时相同的顺序:在一个空白页面上,先放上底层文字层,然后将插图顺次堆叠上去,插图的位置由Pdg2Pic在生成的接口文件时加以描述。通常PDF文件中处理图文混排都用这种模式。

DjVu中的层

DjVu中层的含义比较明确,在文件格式规范中有清晰的定义:分为背景层和前景层,但是前景层又可以分解成前景蒙板层和前景层,所以一个标准的多层DjVu其实可以包含三层: 背景层(background layer)、前景层(foreground layer)、前景蒙板层(foreground mask)。在Lizardtech公司出版发行的《Lizardtech DjVu Reference DjVu V3》中,对他们的说明是:

  • The
    background layer is used for encoding the pictures and the paper texture.
  • The
    foreground layer is used for encoding the text and the drawings.
  • The main
    component of the foreground layer is a bi-level image named the foreground
    mask. The pixel size of the foreground mask is equal to the size of the
    DjVu image. It contains a black-on-white representation of the text and
    the drawings.

我自己的经验和理解:

  • 前景蒙板层:对页面上具有清晰轮廓的对象加以描述,如文字、表格、线框、线条等。
  • 前景层:为前景蒙板层所描述的轮廓提供填充色。
  • 背景层:包括背景、底纹、插图等。

在显示DjVu页面的时候,实际象素点的颜色根据蒙板层中对应点的颜色进行选取:如果蒙板层中该点为黑,则该点实际颜色从前景层取,否则从背景层取。

如果希望对DjVu的三层结构进行详细研究,可以用DjVuToy v0.04+,导出DjVu的文件结构和三层图像,与《Lizardtech DjVu Reference DjVu V3》中的说明进行对比。

我个人一直认为,DjVu所吹嘘的清晰度、压缩比,都与它的分层方式有很大关系。

先说清晰度。由于采用模板层对轮廓进行选取,最终显示出来的DjVu图像在文字、线条等轮廓边缘显得非常锐利、清晰,不会出现JPG图像那样的细小碎片(高频杂波),看起来自然舒服。

再说压缩比。对于文字,DjVu在前景蒙板中使用JB2压缩,这种压缩与PDF中的JBIG2相似(在开源项目djvulibre中对二者的渊源有过描述),对于黑白图像,尤其是以字母、数字为主的黑白图像,具有非常高的压缩率。而对于插图、底纹等彩色信息,DjVu通常在背景层中用IW44压缩。IW44JPEG 2000也颇有渊源(这在djvulibre里也有描述)。

总之,DjVu通过将页面内容分解,针对不同的内容,在不同的层中用不同的算法进行压缩,其还原效果、压缩比自然要比其他只有一层的图像格式,如JPGJPEG 2000要好。

另外我相信,如果将DjVu的分层技术活用到PDF格式上,也可以减小扫瞄版PDF文件的体积:目前的转换软件在将图文混排的扫瞄页面转换成PDF时,采用的是早期PDG的做法,即将整页作为一个图像存入PDF,这样当然比较缺乏效率。如果能够向后来的PDG学习,将文字区域和插图区域分开,分别采用不同的压缩算法(PDF支持不同的图像对象采用不同的压缩算法),则整个PDF文件的长度可以大大减少。目前只是没有人去研究这种分割的方法,并加以实现。

另外在DjVu中也支持类似双层PDF”的东西:看到的是一张扫描出来的图像,用鼠标一选则能选中文字,或对文字进行检索。这种双层DjVu”的文字部分在DjVu文件格式规范中同样没有使用层(layer这个词 加以定义,而是叫做“Text Chunk”。和PDF一样,这种DjVu也要求字压图,因此其结果也基本上不可再校对、编辑:不是技术上不可以,是人的精力和精神无法承受。

 

 

抱歉!评论已关闭.