作者:马健
邮箱:stronghorse_mj@hotmail.com发布:2012.06.11

目录
一、背景
二、能够校对的PDF需要满足的条件
三、校对工具的选择
四、校对过程
五、延伸讨论

事先声明:本文所谈校对方法仅适用于DjVuToy、FreePic2Pdf、Pdg2Pic所生成的双层PDF,对其他软件生成的双层PDF无效,不喜勿进。

一、背景

随着在DjVuToy、FreePic2Pdf、Pdg2Pic中均支持双层PDF,一个
必然要问的问题是:如何对双层PDF进行校对?原因无他,双层PDF都是基于OCR技术的,而OCR百分百无错是不可能的,至少目前是完全没有可能的。

目前双层PDF的校对方法大体上有两种:

1、基于XML的校对

这种方法的核心思想是:把双层PDF中的隐藏文本导出,然后对文本进行校对,再导入回去。由于隐藏文本除了文本字符串外,还有显示位置、显示比例等信息,因此只用纯文本文件难以表述,
而XML文件表达得更全面一些,故多用XML。

这种方法其实在DjVuToy中也被我用来校对双层DjVu,所以对其弊端早有体会:编辑文本固然容易,但想更改文字位置、字体大小却很困难。但要想保持隐藏文本与底图的一致性,在编辑文字后对文字显示位置或显示比例进行更改也是必不可少的。

DjVu格式由于其天然缺陷(详见我写的《DjVu、PDF中的隐藏文本》),再加上工具缺乏,采用导出、导入的方法那是迫不得已,PDF如果还来这一套,
未免太不与时俱进,恐怕会被行家所笑话。

2、基于PDF编辑工具的校对

与孤寒的DjVu相比,由于PDF文件的广泛流传、深入人心,各种PDF工具如今是层出不穷,其中自然有一些能够直接对PDF中的文字进行编辑的工具。双层PDF中的文本由于是隐藏文本,因此通常不能直接用这些工具进行编辑,需要先把隐藏文本显示出来后才能编辑,编辑完成再隐藏回去。

与基于XML的校对方法相比,用PDF编辑工具直接校对双层PDF的文本,不仅编辑过程比较直观,而且调整文字显示位置、显示比例也比较容易,鼠标拖一下即可。因此在DjVuToy、FreePic2Pdf、Pdg2Pic中均针对这种校对方法提供辅助工具,辅助完成校对过程中所需的“显示隐藏文本”、“隐藏校对过的文本”等功能,本文下面也仅针对这种方法进行阐述。

二、能够校对的PDF需要满足的条件

前面一再强调“仅针对DjVuToy、FreePic2Pdf、Pdg2Pic所生成的双层PDF”,原因在于不是什么样的双层PDF都可以用PDF编辑工具进行校对的——在我看来,以下几个关键技术点决定了校对的难易程度:

1、采用内嵌字体还是外挂字体?

PDF中的文字允许使用内嵌字体,也允许使用外挂字体,相对来说采用外挂字体的更易于校对:内嵌字体为减小文件长度,通常只嵌入所需用到的文字的字形,用不到的就不嵌入了。在这种情况下如果想增加一个原来没有的字可就麻烦了。而外挂字体则不受此限制,只要外部字体文件中有字形的文字,都可以加入进来。

当然外挂字体的平台兼容性比外挂字体略差:找不到字体的时候自然就不能显示。不过这个问题的影响和解决方法在我看来不是啥大问题,在简体中文环境下更没有问题。

所以一项技术的选择有时候没有对错之分,只有侧重点的不同:Acrobat侧重于“平台兼容性”,所以选择了内嵌字体;我的三个软件考虑“校对”、“文件长度”、“实现难易程度”等,就选择了外挂字体。

2、“字压图”还是“图压字”?

对于双层PDF来说,隐藏文字在顶层,扫描图像在底层的是“字压图”,否则就是“图压字”。在实际中两种路线都有人采用:Acrobat生成双层PDF采用的是字压图,deent75采用的是图压字。在我看来,采用字压图路线的双层PDF更便于校对:如果采用字压图,图像显示出来后还能看到上层的文字,反之文字就会被图像盖住。

deent75采用图压字可能也有它自己的考虑,但真实原因它不说就谁也不知道,总之我那三个软件在别的地方都在全力模仿deent75,唯独在这个地方坚定不移地跟Acrobat走——字压图。

三、校对工具的选择

同样的原因,这世上也不是什么编辑软件都适合做双层PDF校对的,在我看来至少需满足如下条件才行:

1、支持外挂字体。即采用外挂字体的PDF,在编辑完成后还是外挂字体。这条虽然简单,但直接就把Acrobat排除了:采用外挂字体的PDF,在用Acrobat编辑存盘后,新加入的字就全变成内嵌的了。

2、支持亚洲语言,尤其是简体中文。这一条基本上就把大多数国外的编辑软件给排除了。

最终选来选去,发现还是Foxit PDF Editor和Foxit Phantom满足要求。具体我测试了Foxit PDF Editor
v1.2、v1.5、v2.2,及Foxit Phantom v2.0、v2.2.4、v5.0.4,感觉各有不同:

Foxit PDF Editor v1.2:对Adobe标准中文字体支持不佳,半角文字显示宽度超宽。
Foxit PDF Editor
v1.5:修正了半角问题,但编辑界面与v1.2相同,操作繁琐。
Foxit PDF Editor
v2.2:编辑界面较v1.5简化,在宽屏下使用方便,普屏下足够让你咬牙切齿。
Foxit Phantom
v2.0、v2.2.4:编辑界面非常简洁,符合一般文字处理习惯。
Foxit Phantom v5.0.4:版本大跃进,功能大倒退。Foxit
Phantom在v2.2.4后,一跳就跳到了v5.0,没有中间的3、4版本,但5.x版本放弃了原先的文本编辑模式,改为采用将Foxit PDF
Editor换了个名字集成进来的方式,所以文字编辑功能在方便性上相当于Foxit PDF Editor v2.x,比Foxit Phantom
v2.x大有不如。

最终,我选择Foxit Phantom v2.2.4作为双层PDF编辑器,并写在那三个软件的界面提示中。

如果只想用文字编辑功能,不需要其他闲杂功能,Foxit Phantom
v2.2.4很容易实现绿化:安装完成后,直接将安装文件夹中的全部内容复制出来,就是绿色版了。如果再删除用不到的文件,整个运行所需的文件约17.1
MB,包括简体中文界面所需文件。

四、校对过程

在解决了文件问题和工具问题后,下面就该具体说一下校对过程了。校对过程其实也很简单,大体上分为三步:

1、显示出双层PDF中的隐藏文字

在DjVuToy、FreePic2Pdf、Pdg2Pic中,均有“校对”按钮,点击后进入“PDF校对工具”界面,第一个页签就是“显示文字”——Foxit
Phantom只能编辑可见文字,隐藏文字是不能编辑的,所以要先显示出来才能走到以后的步骤。

在操作的时候,可以选择是只显示文字,还是图像、文字一起显示。这个需要根据自己的习惯进行选择:如果只显示文字而隐藏图像,则校对的时候看起来更简单一些,不容易眼花,但是在调整文字显示位置、显示比例的时候,会没有参照物。文字、图像同时显示(图像可以选择透明度)看起来会累一点,但如果有什么字拿不准,鼠标把文字拖走即可看到底图,看完了按Ctrl+Z就可以让文字回到原位,用鼠标拖拽调整文字显示位置、显示比例时也有参照物。

2、用Foxit Phantom v2.2.4校对PDF

用Foxit Phantom
v2.2.4打开PDF文件后,鼠标左键点击其工具条上的“双击文本对象或右键点击对象对其修改”按钮,以后再用鼠标左键双击需要编辑的文字即可对其进行修改,单击则可通过拖拽改变文字的显示位置、显示比例。总之感觉和用PowerPoint改PPT差不多,所以我说它方便。

3、校对完成后,把文字再隐藏起来

毕竟文字隐藏起来后,才是普通意义上的“双层PDF”。DjVuToy、FreePic2Pdf、Pdg2Pic的“PDF校对工具”界面中的第二更页签,就是用来干这个的。不论第1步中采用了什么样的显示方式,经此一步后都回到隐藏文字、显示图像的双层PDF,只不过文字是经过校对的。

如果对校对结果很有自信,对文件大小又比较在意,还可以再走一步:把双层PDF中的扫描图像全部删掉,只留下文字层。这样搞出来的文字版PDF不仅文件长度比较小,而且文字版式与原文相同,至少作为参考文献引用的时候,页码、行数是不会错的。

以前看Ken777制作“精确版面还原PDF”的时候,羡慕了很久,后来Acrobat中提供的ClearScan也很令我心动,这次总算有机会照猫画虎了。

五、延伸讨论

用过PdfToy的人可能会觉得DjVuToy、FreePic2Pdf、Pdg2Pic中“PDF校对工具”的界面看起来有点眼熟,其实这个工具从界面到代码都COPY自PdfToy的“流过滤”功能,只不过把表达式写死了,所以只能支持特定情况的PDF,对其他PDF无能为力。

对于不是用DjVuToy、FreePic2Pdf、Pdg2Pic生成的双层PDF,其实只要满足前述的采用外挂字体、字压图的情况,理论上说都可以用PdfToy的“流过滤”功能实现与“PDF校对工具”相同的功能,只不过所用的表达式可能要根据具体情况做一点修改。在《PdfToy应用案例(
八)》(案例十三)中,我将详细说明“PDF校对工具”所用到的表达式及其原理,便于PdfToy的用户举一反三。

校对双层PDF中的隐藏文本的更多相关文章

  1. DjVu、PDF中的隐藏文本

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.06.11 目录一.背景二.DjVu中的隐藏文本三.PDF中的隐藏文本 一.背景 目前对于扫描电子文档,网上比较流行 ...

  2. Js控制显示、隐藏文本框中的密码

    Js控制显示.隐藏文本框中的密码,也可称为是一款小型的JavaScript星号密码破解器,点击会显示出密码类型的文本框中的真实信息,再次点击则还原,程序 主要是获取HTML元素对象,然后强制更改元素属 ...

  3. .net环境下从PDF文档中抽取Text文本的一些方法汇总

    1.PDFBox的IKVM版本:据我所知,目前只有PDFBox的IKVM版本能比较好地从PDF中提取文本,PDFBOX更多信息请访问http://www.pdbox.org,关于其应用实例,可以参考C ...

  4. C#在PDF中如何以不同颜色高亮文本

    高亮的文本有助于阅读者快速有效地获取文章关键信息.在PDF文件中,对文章的不同文本,关键词.句等进行不同颜色的文本高亮操作,可以使阅读者在阅读过程中有效地区分不同高亮颜色文本的意义.在下面的示例中,我 ...

  5. java itext替换PDF中的文本

    itext没有提供直接替换PDF文本的接口,我们可以通过在原有的文本区域覆盖一个遮挡层,再在上面加上文本来实现. 所需jar包: 1.先在PDF需要替换的位置覆盖一个白色遮挡层(颜色可根据PDF文字背 ...

  6. 使用itext直接替换PDF中的文本

    直接说问题,itext没有直接提供替换PDF中文本的接口(查看资料得到的结论是PDF不支持这种操作),不过存在解决思路:在需要替换的文本上覆盖新的文本.按照这个思路我们需要解决以下几个问题: itex ...

  7. C# 设置或验证 PDF中的文本域格式

    概述 PDF中的文本域可以通过设置不同格式,用于显示数字.货币.日期.时间.邮政编码.电话号码和社保号等等.Adobe Acrobat提供了许多固定的JavaScripts用来设置和验证文本域的格式, ...

  8. 用python解析pdf中的文本与表格【pdfplumber的安装与使用】

    我们接触到的很多文档资料都是以pdf格式存在的,比如:论文,技术文档,标准文件,书籍等.pdf格式使得用机器从中提取信息格外困难. 为了解决这个问题,我找到了几种解决方案,最后选择了python上的p ...

  9. (转)原始图像数据和PDF中的图像数据

    比较原始图像数据和PDF中的图像数据,结果见表1.1.表1.1中各种“解码器”的解释见本文后续的“PDF支持的图像格式”部分,“PDF中的图像数据”各栏中的数据来自开源的PdfView.如果您有兴趣查 ...

随机推荐

  1. UML类图与类的关系详解【转】

    在画类图的时候,理清类和类之间的关系是重点. 类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分 ...

  2. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  3. 谈谈Linux内核驱动的coding style

    最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多.当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代 ...

  4. arm linux 下移植busybox 的tftp

    (1)进入busybox目录,make menuconfig ,然后在networking中勾选tftp项跟tftpd项. (2)配置/etc/inetd.conf 中关于tftp的选项(此部未验证, ...

  5. Linux基础命令-系统时间

    Linux启动时从硬件读取日期和时间信息,读取完成以后,就不再与硬件相关联 Linux的两种时钟 系统时钟:由Linux内核通过CPU的工作频率进行的: date:显示系统时间 +%D +%F dat ...

  6. 四川第七届 D Vertex Cover(二分图最小点覆盖,二分匹配模板)

    Vertex Cover frog has a graph with nn vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and mm edges (v(a1), ...

  7. Jconsole 测试.

    Jconsole 测试. 1 下载并安装 d:\Program Files\Java\jdk1.8.0_111\ JDK自带,Windows下图形界面,监控分析Java程序 2 查看jmx进程号 [r ...

  8. HTML5的local storage

    function clickLogin(){ var userName = $("#user").val().trim(); // console.log(userName); / ...

  9. Canopy聚类算法(经典,看图就明白)

    只有这个算法思想比较对,其他 的都没有一开始的remove: 原网址:http://www.shahuwang.com/?p=1021 Canopy Clustering 这个算法是2000年提出来的 ...

  10. 使用SharedPreferences接口来实现记住密码功能

    SharedPreferences接口非常适合用来存储零散的数据.这里我们用来实现记录用户名和密码的功能.在前面我用过IO流来实现记住密码的功能.那么用SharedPreferences接口会比用IO ...