PdfToy: A handy toolkit to analyze PDF files.
作者:马健 邮箱:stronghorse_mj@hotmail.com 主页:老马的原创空间
FAQ 使用说明 一、软件安装/删除 二、软件使用 转为图像 导出图像 转回PDG 裁剪页面 页面宽度 解密++ 批量检查 文档属性 流过滤 流导出 书签相关 文件结构 附录A 鸣谢 附录B 正则表达式语法 附录C
版本更新记录
Q:PdfToy是什么? A:这是一个处理PDF的工具集,具有下列功能:
- 转为图像:将PDF文件每页转成一个图像。可以将采用“特殊内嵌字体”、“文字转路径”等手段进行保护的PDF转成图像,然后供OCR使用。
如果想在不支持PDF的手持设备上阅读,也可以用此功能转换成图像,用手持设备上的图像浏览软件进行浏览。
- 导出图像:导出PDF文件中的所有图像,并根据图像数据自动选择图像文件类型,尽量做到无损导出。相当于UnicornViewer中的“导出图像”,不过可以导出整个PDF中的所有图像
,并能指定是否合并切分过的子图像。
- 转回PDG:将采用Pdg2Pic+FreePic2Pdf制作的PDF文件再转回PDG,支持批量。
- 裁剪页面:对PDF进行裁剪,可以指定裁剪区域、裁剪页码范围等。类似Acrobat同名功能,仅仅是在PDF中设置裁剪区,实际内容没有变化,因此以后如果不满,可以删除以前的裁剪,或重新裁剪。
- 页面宽度:将PDF所有页面设置为统一宽度,并等比例缩放页面内容。
- 批量解密、web优化、加解压、设置页面部局、设置导览标签、设置放大率、清空初始视图、删除Metadata:对PDF文件进行规范化处理。
- 批量检查:批量检查PDF文件是否存在页面错误或结构性错误。
- 导出、导入文档属性:批量导出PDF文档属性,便于对PDF文件进行管理,包括建立PDF数据库、对PDF重命名等
;批量导入PDF文档属性,便于对PDF文档属性进行规范化。
- 流过滤:对流对象字典、页面内容流、字典对象、所有流进行正则表达式替换;或正则表达式搜索,并报告找到的文件、对象、页码。
- 书签相关:包括设置书签的初始状态、显示状态、点击后的缩放状态等。
- 查看PDF文件结构:能够以文本形式导出PDF文件结构、页面树(page
tree)、指定对象内容、xref表等。对于研究PDF内部结构有用。
用户在使用本软件前务必先认清以下事实:请勿将本软件用于非法目的。使用本软件造成的一切后果(包括法律后果)由使用者自行承担。
Q:为什么要开发PdfToy? A:为了深入了解PDF文件的各个方面。
Q:PdfToy收费吗? A:PdfToy只能在网上读书园地通过论坛虚拟币购买,通过其他任何手段获取到的均为盗版。
一、软件安装/删除
本软件安装非常简单:创建一个目录,用WinZip将下载下来的ZIP包解压缩到该目录即可。
如果需要处理的PDF文件使用了非内嵌字体,本软件会自动调用UnicornViewer的字体文件,因此建议这两个软件安装在同一个文件夹下,以共用字体文件。
本软件的删除也很简单:直接删除从ZIP包中解压缩出来的所有文件及运行过程中生成的文件即可。
ZIP包中包括下列文件:
- PdfToy.exe。这是软件的主程序。
- PdfToy.htm。本帮助文件。
如果您下载到的ZIP包中还包括其它文件,毫无疑问不是我放进去的,有广告或木马之嫌疑,请立即删除。
另外程序运行过程中还会生成以下文件:
- PdfToy.ini。这个是参数保存文件,第一次更改参数后生成。退出PdfToy,删除此文件,再重启PdfToy,即可恢复缺省参数。
- PdfToy_log.txt。这个是错误记录文件,在转换过程中出现错误时自动生成,没有错误则自动删除以前的错误记录。
- PdfToy_rslt.txt。这个是缺省的结果记录文件,“批量检查”、“文档属性”的缺省结果就是此文件。
- PdfToy.pwd。PDF文件密码表。
二、软件使用
统一说明
本软件所有文件、文件夹输入框均支持快捷键Ctrl+A(全选)、Ctrl+C(复制)、Ctrl+X(剪切)、Ctrl+V(粘贴)、Ctrl+Z(撤销)),也支持从资源管理器直接拖拽文件、文件夹。 Ctrl+V支持从资源管理器直接粘贴文件、文件夹。即在资源管理器中选择某个文件或文件夹,选“复制”,然后光标定位到输入框,按Ctrl+V,即可将文件、文件夹的完整路径粘贴过来。
公共按钮:
- 恢复:PdfToy会自动记忆您在各页中设置的参数(记录在PdfToy.ini文件中),点击“恢复”按钮可以将所有参数恢复到缺省值。
- 显示设置:隐藏/恢复某些页面。通过隐藏不常用的页面,可以简化界面。
- 关于:显示PdfToy的版本和相关信息。
- 帮助:显示本文件。
如果需要打开带密码保护的PDF文件,本软件会先逐一尝试密码表中记录的密码,没有找到再弹出对话框提示用户输入密码。输入的密码会自动记录在PdfToy.pwd文件中,便于以后复用,也可以点击“密码表”按钮手工对密码表进行维护。
转为图像
功能:
将PDF文件的每一页转换成一个图像,存入指定的文件夹。某些PDF文件采用了“使用特殊内嵌字体”、“文字转路径”等手段对自身进行保护,防止复制、导出文本,对这样的PDF可以用此功能导出页面为图像,然后OCR。 注意:如果PDF文件中使用了非内嵌字体,需要UnicornViewer字体文件的支持,因此最好与高版本UnicornViewer安装在同一个文件夹下。 操作:按界面上标注的1、2、3、4操作即可。
在1中,如果选择了单个PDF文件,则进行单文件导出,导出后的文件存放到3中制定的文件夹;如果选择了某个文件夹,则进行批量导出:该文件夹下的所有PDF文件均导出为图像,但不支持子文件夹周游,每个PDF的导出结果单独存放在一个位于3中选定文件夹下的子文件夹。
目前将PDF文件转换成图像的软件车载斗量,本软件具有下列特色:
- 可以选择放大倍率。某些页面尺寸较小,直接导出后OCR可能比较困难,这时可以选择较大的放大倍率,以获得大尺寸的图像。但是必须注意,在页面尺寸较大时,过大的放大倍率需要申请更大的内存空间,申请失败时导出也会识别。因此建议开始先用1.0倍率试导出,发现不行再逐渐增加放大倍率。
- 可以选择按固定宽度导出。某些手持设备中的PDF阅读软件受内存限制,对于分辨率较高的扫描PDF支持不好,这时可以用此功能导出并缩图,然后再用FreePic2Pdf等软件转回PDF。
- 可以选择按指定DPI导出。如果DPI设置与原始图像DPI一致,导出后的图像原始图像的像素尺寸相同。
- 可以选择是否对字体进行平滑。如果选择“字体平滑”,采用了“使用特殊内嵌字体”、“文字转路径”等手段的PDF页面导出后在PNG、JPG格式中看起来很漂亮,但是OCR效果可能就没这么好了(OCR软件通常只认黑白图像)。如果以OCR为目的,建议不要勾选此选项。
- 可以直接导出成黑白TIFF,用于OCR。
- 支持批量导出。
导出图像
功能:将PDF文件中的所有图像,逐页导出。导出时根据图像数据特征,自动选择最适合的图像文件格式,尽量做到不失真。 操作:按界面上标注的1、2、3、4操作即可。
在1中,如果选择了单个PDF文件,则进行单文件导出,导出后的文件存放到3中制定的文件夹;如果选择了某个文件夹,则进行批量导出:该文件夹下的所有PDF文件均导出图像,但不支持子文件夹周游,每个PDF的导出结果单独存放在一个位于3中选定文件夹下的子文件夹。
“导出方法”分两种:
- 按页面导出。这是缺省的导出方法,可以按照页面描述中说明的图像用法,对图像进行合并;或校正图像反白;或导出指定页面范围中的图像
;或导出页面内容流中的嵌入图像(inline images)。导出后的文件名如果选择“带页码”,则可以保证文件名按照页码顺序进行排列。
- 按对象导出。通常只有在导出隐藏图像,或页面描述中有错导致图像不能正常显示时,才需要选择这种导出方法。
补充说明:
- 如果选择了“导出灰度蒙版”,将导出构成SoftMask的图像,否则不导出。
- 如果图像已经被切分成一系列子图像(如TIFF中的tile或strip),可以选择合并。
- 只有在选择合并,并且输出类型为JPG的情况下,“JPG质量”才起作用。
- 只有在选择合并情况下,“包括页边”选项才起作用。如果被选中,合并后的图像将按照页面大小设置,包括页边空。否则合并后的图像不含页边空。
- 由于嵌入图像通常较小,需要导出的机会并不多,因此不记忆“导出嵌入图像”参数,缺省为不导出。导出后的嵌入图像文件名后缀为:_ilxxxx。
- 如果选择了“JPG自动反白”,则自动对反白的JPG图像重新压缩,保证导出后的图像与在PDF里看到的一样,而不是黑乎乎一片。
“转为图像”与“导出图像”的区别:
- “转为图像”可以将图像连同文字、路径等一起转换成图像,“导出图像”只能导出图像内容,对文字、路径等内容无能为力。
- 对于纯由图像构成的页面,“导出图像”能够尽量保持原始图像大小,“转为图像”则按照页面逻辑尺寸及选定的放大率对图像进行缩放。
- 因此,对于纯图像构成的PDF,应尽量选择“导出图像”,否则选择“转为图像”。
转回PDG
功能:将用Pdg2Pic+FreePic2Pdf制作的PDF,或CX发行的PDF,再逆向转换成PDG。如果是用其他软件或方法制作的PDF,用此功能转换后的结果未知。 操作:
导出单个PDF,按界面上标注的1、2、3、4操作即可;批量导出,直接点“批量转换”,选择需要导出的PDF所在文件夹即可,不支持多级文件夹。对于批量导出,自动按照源PDF路径创建目标文件夹。
补充说明:
- 如果选择了“只用UnicornViewer看”,转换出来的黑白图像存为TIFF、JPG图像存为JPG、其他图像(可能是大图PDG)存为PNG,文件扩展名统一更改为PDG。如果未选,则
除单色图像转换成单色PDG外,其他所有图像均自动转换成JPG(质量由“JPG质量系数”参数决定),以保证原版ssreader能够正常读取。所以如果转换的PDF是从大图PDG生成的,注意务必勾选此选项,以免后悔。
- 如果选择了“只用UnicornViewer看”,则“JPG质量系数”参数无效。
- 如果选中“生成空白BookInfo.dat”选项(缺省为选中),则导出后生成空白的BookInfo.dat文件,否则不生成。
- 本软件的PDG编码器不是官方出品,质量不敢保证百分百靠得住,转换出来的PDG文件请注意先用PdgThumbViewer进行检查。
- 转换出来的PDG文件均按绝对页码顺序编号,如果想恢复PDG分类编号,请用PdgRenamer。
- 上述其他软件均假设存放在PdfToy所在文件夹。
- 由于种种原因,本软件转出来的BookInfo.dat是空的,有需要的请自行填写。
裁剪页面
功能:对PDF进行裁剪,可以指定裁剪区域、裁剪页码范围等。类似Acrobat同名功能,仅仅是在PDF中设置裁剪区,实际内容没有变化,因此以后如果不满,可以删除以前的裁剪,或重新裁剪。
操作:
裁剪页面:
- 选择需要操作的PDF文件。
- 选择裁剪区域。建议在“裁剪选项”界面中,通过翻页按钮多查看几页,避免出现误裁。
- 选择结果文件。缺省情况下结果文件与源文件是同一个文件,即会对源文件进行覆盖。
- 点“裁剪”按钮开始裁剪。
检查裁剪:如果想知道一个PDF文件是否被裁剪过,可以选择需要检查的PDF文件,然后点“检查”按钮。
去除裁剪:如果对裁剪过的文件不满意,可以按照上面“裁剪页面”的操作,重新进行裁剪,也可以在选择PDF文件后,直接点击“去除裁剪”按钮,去除PDF中的裁剪限制。
补充说明:
- 裁剪页面功能与Acrobat中的同名功能类似,其实并没有更改PDF中的实际内容,只是在页面描述中加了一个裁剪区域限制,因此才可以被删除。
- 与Acrobat同名功能相比,本软件可以直接处理被口令加密的PDF文件,不需要事先解密。
页面宽度
功能:PDF页面宽度如果不一致,在Acrobat中看起来会忽大忽小,很影响情绪(UnicornViewer等第三方浏览器无此烦恼)。因此提供此功能,将PDF页面缩放至指定宽度,页面高度按原长、宽比进行缩放,页面内容也等比例缩放,以便浏览。
操作:按界面上标注的1、2、3、4操作即可。
补充说明:
- 此功能仅对页面及内容显示进行缩放,对原页面内容不进行更改,因此不存在缩放后质量下降的问题。如果缩放后“感觉”出现质量下降,请在浏览器上找原因。
- 此功能每使用一次均加入一次缩放矩阵,因此不宜对同一个文件反复使用。
解密++
功能:这是一个杂七杂八的功能,最初仅想实现文件批量解密,后来又陆续加入了web优化、压缩/解压、清空初始视图等功能
操作:按界面上标注的1、2、3、4操作即可。
补充说明:
- 只有当源文件夹、目标文件夹相同时,“源文件另存为.bak”才起作用。如果该选项未选中,则源文件会被覆盖,否则源文件另存为.bak文件。
- web优化:在Acrobat中被称为“快速web查看”,名字听起来不错,但对本地浏览没啥大用,反而会造成文件轻微膨胀。选择“去除”可以将源PDF中的web优化数据去掉;选择“添加”则可以为原先没有web优化的PDF加入web优化;选“不变”则不理它,原来是啥样就是啥样。
- 压缩:为了节省空间,PDF中的很多数据采用压缩存储,但是在分析PDF内部数据结构时,人肯定读不懂压缩后的数据,只能解压后才能读。因此如果想把PDF中的zip、lzw无损压缩数据展开,请选择“解压”;如果研究完了想再压回去,请选择“压缩”。如果不打算对PDF数据进行研究,就始终保持“不变”吧。
如果选择了“压缩+对象流”,会在压缩的同时,尽量对各种可以合并的对象进行合并,并压缩成对象流(object
stream),以获取最小文件长度。对象流需要PDF 1.5(Acrobat 6)以上才支持。
- 页面部局:对打开PDF时的页面部局进行设置。
- 导览标签:有些人喜欢在阅读的时候显示书签,有些人则觉得书签对屏幕资源是一种浪费。如果PDF是自己做的,自然可以根据自己的喜好进行设置,但是别人做的PDF就不一定符合自己的口味了。通过这个功能,可以对PDF的导览标签进行批量设置,便于浏览。
- 放大率:对打开PDF时的放大率进行设置。
- 清空初始视图:有些PDF对初始视图进行了限制,如隐藏菜单条、直接进入全屏等。如果选择了此选项,将去除PDF初始视图中的下列项:
部局和放大:页面部局、放大率; 窗口选项:调整窗口大小适合初始页面、在屏幕上居中窗口、以全屏模式打开; 用户界面选项:隐藏菜单栏、隐藏工具栏、隐藏窗口控件。 因此,“清空初始视图”与“页面部局”、“放大率”选项可能会存在冲突。PdfToy内部认定“清空初始视图”的执行顺序先于“页面部局”、“放大率”。即如果在选择了“清空初始视图”后,又选择了“页面部局”或“放大率”,则先执行“清空初始视图”,然后执行“页面部局”、“放大率”。如果确实想清除“页面部局”、“放大率”,则应对这两个选项选择“不变”,然后选择“清空初始视图”,这样PdfToy在执行“清空初始视图”后,就不会再执行“页面部局”、“放大率”。
- 删除Metadata:删除PDF文件中的Metadata信息。
如果只是想对PDF进行优化,以减小文件长度,可以点击“优化”按钮,自动设置优化参数。 如果参数选乱了,点击“恢复缺省参数”可以恢复。
如果所有参数均为初始设置(点击“恢复缺省参数”可恢复初始设置),则对PDF进行下列处理:
- 对PDF文件进行解密操作,以去除所有安全性限制。这也是本功能名为“解密++”的原因。
- 修复所有可修复的结构性错误。如果用其他功能处理PDF时提示PDF可能有问题,可以用此功能尝试修复。
对于加密PDF,由于水平有限,目前只能去除口令安全限制,对证书等安全限制无能为力。
仅用于《家庭藏书》系列的选项:《家庭藏书》是一套比较早的光盘,其中的PDF文件在高版本Acrobat下浏览时存在一些问题,包括书签显示乱码、文件名更改后书签跳转失效、PDF文档属性中的“说明”部分在Acrobat中显示为乱码等。下面这些选项就是解决这些问题的:
- 清除“说明”乱码。消除文档属性中的乱码,包括标题、作者、主题、关键字、应用程序、PDF制作程序共6个字段。
- 清除书签乱码。消除书签中的乱码,并将所有不是指向fm.pdf的书签项全部改成指向自身,这样文件更名后书签项还能用。
由于这些选项仅对《家庭藏书》系列有效,对其他PDF基本没意义,因此没有记忆功能,每次运行时均设置为缺省值——不选中。
批量检查
功能:批量检查PDF文件是否存在页面错误,或结构性错误。 操作: 1、选择存放需要检查的PDF文件夹。 2、选择检查结果文件存放位置。 3、选择检查类型。 4、点“开始检查”按钮。
补充说明:检查类型可分两类:
- 文件结构:对PDF文件结构进行检查,看其是否符合《PDF
Reference》的要求。注意此功能仅检查文件结构,不检查数据流,因此报错的文件通常用Acrobat打开会报错,但是没有报错的文件在用Acrobat打开时仍然可能报错。通常此功能仅用于PDF文件格式研究、比较之目的。
- 页面数据:采用UnicornViewer的PDF解码引擎,在内存中模拟PDF文件显示过程,逐页解码PDF页面数据,并报告其中发现的问题。通常没有给出错误报告的PDF文件均可用UnicornViewer正常显示,报告有问题的PDF文件用UnicornViewer多半能显示(UnicornViewer有很强的PDF自动修复功能),用Acrobat就不一定了。
此功能需要UnicornViewer字体文件的支持,否则不能正确解码非内嵌字体,可能产生虚假报警。
“检查空白页”、“检查连续重复页”仅在“检查类型”为“页面数据”时有效:
- 检查空白页:检查是否有空白页。如果该页已存在其他页面数据错误,则忽略空白页检查。
- 检查连续重复页:如果存在与上一页完全相同的页面,则报错。如果出现跳页或隔页重复,此功能无能为力。如果该页已存在其他页面数据错误,或已经报告过空白页,则忽略该项检查。
检查结果可以分为如下几类:
- 需要打开口令:打开PDF需要口令,此类文件将被直接忽略,不进行检查。
- catalog损坏:PDF文件的catalog对象损坏。UnicornViewer将不能打开有此错误的PDF。
- 损坏:PDF文件已损坏。UnicornViewer将不能打开有此错误的PDF。
- 打开失败:UnicornViewer将不能打开有此错误的PDF。
- 结构错误:PDF文件中含结构性错误,后跟错误原因。Acrobat、UnicornViewer大多数情况下将不能打开有此错误的PDF,但也不排除例外。
- 含可修复的结构错误:PDF文件中含结构性错误,但错误比较轻微,可被修复或忽略。如果选择了“显示详细信息”选项,将显示出详细的错误点,否则不显示。对于报告此类错误的PDF文件,Acrobat、UnicornViewer一般能够正常打开,但也不排除例外。
如果希望修复所有看修复的错误,可以用“解密++”功能,里面所有的选项均不选,扫一遍以后所有加密PDF会变成非加密PDF,所有可修复错误也会被修复。
如果没有选择“报告详细信息”,则只报告有问题的文件名,否则列出有问题的文件,及详细的错误信息。
文档属性
功能: 1、批量导出PDF文档属性,便于对PDF文件进行管理,包括建立PDF数据库、对PDF重命名等。 2、批量导入PDF文档属性,便于对PDF文档属性进行规范化
操作:
导出PDF文档属性: 1、选择存放需要导出的PDF文件夹。 2、选择导出的文本文件存放位置。 3、选择需要导出的属性项 4、点“开始导出”按钮。
导入PDF文档属性: 1、选择存放PDF属性的文本文件。 2、点击“开始导入”按钮。
补充说明:对于“批量导入”:
- 所有信息均存放在属性文件中,因此源文件夹、选项均无用。
- 导入所需的属性文件格式与导出文件格式相同,支持绝对路径与相对路径。
- 导入的属性只能是标题、作者、主题、关键字,其他属性将被忽略。
流过滤
功能: 1、对PDF流对象字典、页面内容流进行正则表达式替换,以达到对PDF进行批量修改的目的。 2、对PDF流对象字典、页面内容流进行正则表达式搜索,报告匹配的文件、对象、页码。 操作: 1、选择需要操作的文件或文件夹。只有在选择文件夹的情况下,“包括子文件夹”选项才有效。 2、输入需要替换的正则表达式,并指定作用域。 3、选择结果文件或文件夹。 4、点“开始过滤”开始替换,或点“开始查找”开始搜索。
补充说明:
- 正则表达式替换存在文件损坏的风险:如果表达式构造不当,替换后的内容可能不一定符合PDF格式规范。建议在替换前先做好PDF文件备份,替换后及时进行检查。
- “页面内容流”(P),指的是page
content流的内容。通过“文件结构”中的“导出PDF页面树”、“导出指定的PDF对象”功能,可以查看page content流的内容。
- “流对象字典”(D),指的是含有stream/endstream的对象中,介于<<、>>之间的部分,即该对象的对象字典。PdfToy取得的对象字典经过解析与过滤(对空白字符进行处理),因此可能与在UltraEdit32下看到的对象字典有所不同,以在“文件结构”功能中导出的对象字典为准。
- “字典对象”(C),指的是整个对象就是一个字典,Catalog、Pages、Page等均属于字典对象。
- “所有流”(S),指的是所有具有stream/endstream对象中的stream部分,替换或查找时先对流解码,再对解码后的流进行查找或替换,然后再用FlateDecode压缩。解码支持的filter包括ASCIIHexDecode、ASCII85Decode、LZWDecode、FlateDecode,其他不支持的流将被忽略。上面说的“页面内容流”是“所有流”的一个特例。
另外为了避免对图像数据造成破坏,此功能不会对Subtype为Image的流进行过滤。
- “匹配此表达式的字典对象”(N),与“字典对象”类似,但是用附加表达式进行限制,避免出现误伤。
- “字典匹配此表达式的流”(M),与“所有流”类似,但是用附加表达式对流对象的字典进行匹配,只有能够匹配的对象,才会替换或查找流。这是为了避免使用“所有流”可能会对嵌入式文件造成误伤。
- “匹配此表达式的流字典”(T),与“流对象字典”类似,但是用附加表达式进行限制,避免出现误伤。
- D、C、S是早期版本的功能,后来在使用过程中发现了一些副作用,因此在新版本中提出N、M、T。在可能的情况下,应尽量选择N、M、T,并精确设置附加的匹配表达式,避免D、C、S的副作用。
- 由于PDF文件格式本身对大小写敏感,因此所有正则表达式内容均为大小写敏感。
- 在搜索时,如果“报告详情”选项被选中,将列出匹配的文件路径、对象、页码,否则只列出匹配的文件路径。
- 在替换时,如果选中“保留记录”选项,则相当于“替换+查找”,即在替换过程中,会记录具体替换了哪些文件,如果“报告详情”选项被选中,还会记录具体替换的对象、页码。记录文件就是“查找结果”文件。
- 正则表达式存盘后的.pte文件是纯文本文件,每条记录占4行:3行内容,1行空白分隔。
再重复一次:替换功能存在文件损坏的风险,请事先做好备份,事后及时检查。
流导出
功能: 1、导出字典匹配指定正则表达式的流。 2、导出指定对象中的流,指定的对象必须含流,否则将忽略。 3、导出所有嵌入文件 操作: 1、选择需要操作的文件或文件夹。 2、选择选项。 3、选择结果文件或文件夹。 4、点“开始导出”。
补充说明:
- 只有在选择“导出字典匹配表达式”、“导出指定对象流”时,“导出文件扩展名”才作用,导出的文件名=obj+对象ID号. 导出文件扩展名。
- 如果选择“导出所有嵌入文件”,将遍历PDF中的所有对象,处理所有/Type
/Filespec的字典对象,从/F参数中获取原始文件名,从/EF参数中获取流对象。如果文件名重复,可能会出现文件覆盖。
- 如果选择了“导出原始数据流”,则不解码直接导出PDF中的原始数据流,否则导出解码后的流。支持的解码过滤器为:ASCIIHexDecode、ASCII85Decode、LZWDecode、FlateDecode,其他不支持的流将导出原始数据流。
书签相关
功能:设置书签的初始状态、显示状态、点击后的缩放状态等。
操作:按界面上标注的1、2、3、4操作即可。
补充说明:“打开PDF文件时书签显示状态”与“解密++”中的“导览标签”功能重复。
文件结构
功能:能够以文本形式导出PDF文件结构、页面树(page
tree)、指定对象内容、xref表等。对于研究PDF内部结构有用。 操作: 1、选择需要查看的PDF文件。 2、点击相应导出内容对应的按钮。
补充说明:
- PDF文件结构:相当于去掉所有stream后,剩下的PDF“骨架”,可以查看除stream外的所有数据。
- PDF页面树(page
tree):按照页面顺序,导出每个页面的content对象数组。如果想查看具体的对象内容,可以用“导出指定的PDF对象”。如果“包括图像对象”选项被选中,则还会报告每一页中的inline
image数目、实际使用的图像对象(used images)、未使用的图像对象(unused images)。used
images指的是在content流中实际使道的图像,unused
images指的是在页面Resources字典中出现过,但是在content流中未被使用的图像。
注意:如果选择了“包括图像对象”,将逐一解码PDF页面,因此会消耗更多的时间。
- 导出指定的PDF对象:按照输入的对象ID,导出对象的实际内容。如果对象含stream,并且本软件能够解码该stream,则解码后输出。
- 导出xref:导出选定PDF的xref。
本软件的PDF文件解析基于xpdf、qpdf,对PDF中TrueType字体支持来自freetype。“文件结构”部分基于Bedri
Egrilmez的PdfView。图像文件处理采用了Davide
Pizzolato的CxImage,底层JPEG采用了Independent JPEG Group(独立JPEG小组)发布的JPEG LIB源代码,PNG采用了libpng组织提供的源代码,TIFF采用了libtiff组织提供的源代码,zlib采用了ASM版(其实只有两个文件是ASM的) ,DjVu编码采用了djvulibre、miniDjVu源代码。
PDG的CCITT G4编码算法和代码由coolman、hstong提供。
在此对以上组织和个人表示深切的谢意!
一个正则表达式就是由普通字符(例如字符 a 到
z)以及特殊字符(称为 元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
这里有一些可能会遇到的正则表达式示例:
正则表达式 |
匹配 |
^\[ \t]*$ |
匹配一个空白行。 |
\d{2}-\d{5} |
验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。 |
<(.*)>.*<\/\1> |
匹配一个 HTML 标记。 |
字符串替换实例 |
字符串 |
<A HREF=../mrx/arc/mrx_003b.txt> |
正则表达式 |
<A HREF=([\d\D].*)txt> |
替换为 |
<A HREF=$1txt target=center> |
结果 |
<A HREF=../mrx/arc/mrx_003b.txt
target=center> |
下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
字符 |
描述 |
\ |
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,'n'
匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 |
^ |
匹配输入字符串的开始位置。如果设置了 RegExp 对象的
Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 |
$ |
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline
属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
* |
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。*
等价于{0,}。 |
+ |
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配
"z"。+ 等价于 {1,}。 |
? |
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does"
中的"do" 。? 等价于 {0,1}。 |
{n} |
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配
"Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} |
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配
"Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于
'o*'。 |
{n,m} |
m 和 n 均为非负整数,其中n <=
m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood"
中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
? |
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,},
{n,m})
后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串
"oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 |
. |
匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]'
的模式。 |
(pattern) |
匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches
集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用
$0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 |
(?:pattern) |
匹配 pattern
但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|)
来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries'
更简略的表达式。 |
(?=pattern) |
正向预查,在任何匹配 pattern
的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows
(?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows
3.1" 中的
"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) |
负向预查,在任何不匹配 pattern
的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows
(?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows
2000" 中的
"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
x|y |
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或
"food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |
[xyz] |
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的
'a'。 |
[^xyz] |
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain"
中的'p'。 |
[a-z] |
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z'
范围内的任意小写字母字符。 |
[^a-z] |
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到
'z' 范围内的任意字符。 |
\b |
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的
'er',但不能匹配 "verb" 中的 'er'。 |
\B |
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的
'er'。 |
\cx |
匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M
或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\d |
匹配一个数字字符。等价于 [0-9]。 |
\D |
匹配一个非数字字符。等价于 [^0-9]。 |
\f |
匹配一个换页符。等价于 \x0c 和 \cL。 |
\n |
匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r |
匹配一个回车符。等价于 \x0d 和 \cM。 |
\s |
匹配任何空白字符,包括空格、制表符、换页符等等。等价于
[ \f\n\r\t\v]。 |
\S |
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t |
匹配一个制表符。等价于 \x09 和 \cI。 |
\v |
匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
\w |
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
\W |
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |
\xn |
匹配 n,其中 n
为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04'
& "1"。正则表达式中可以使用 ASCII 编码。. |
\num |
匹配 num,其中 num
是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 |
\n |
标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n
个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n
为一个八进制转义值。 |
\nm |
标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm
个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则
n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m
均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 |
\nml |
如果 n 为八进制数字 (0-3),且 m 和 l
均为八进制数字 (0-7),则匹配八进制转义值 nml。 |
\un |
匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode
字符。例如, \u00A9 匹配版权符号 (©)。 |
v0.22
新增功能:在“导出图像”中,增加“JPG自动反白”选项。
功能增强:在导出图像时,如果是带ICC配置的JPG数据,则导出为JPG或TIFF并嵌入ICC配置。
功能增强:对于非JPG压缩的CMYK图像,自动导出为CMYK色彩空间的TIFF文件。
功能增强:在“导出PDF页面树”时,如果选择了“包括图像对象”,并且图像带Mask或SMask,则导出信息中含Mask或SMask的对象ID。
功能修正:在“导出图像”中,如果选择“按对象导出”,则不强制检查对象类型是否是XObject,因为按照PDF
Reference说明,Type字段是Optional。
错误修正:在“导出图像”中,如果选择了“全部合并”,并且在同一页中有两个以上的图像共用同一个Mask或SMask,则合并后的图像不正确。 v0.21
错误修正:导出某些特殊宽度的黑白图像时,可能会出错退出。 v0.20
功能增强:页签图标换成了高彩图标。
功能修正:在“导出图像”页面中,原“导出灰度蒙版”复选框改成“灰度蒙版”下拉列表,除了可以选择是否导出灰度蒙版外,还可以选择是否合并灰度蒙版,专门用来对付32位alpha通道PNG转的PDF。
错误修正:在Win 10下以管理员权限运行后,从资源管理器不能拖拽打开文件。 v0.19
功能增强:增强对含有JPEG 2000图像的PDF的支持。
错误修正:某些数据有错的加密PDF可能会导致出错退出。 v0.18
错误修正:如果PDF中包含CMYK色彩空间的JPG图像,转换成图像后可能会出现色彩不准确。 v0.17
错误修正:某些PDF中的字体信息错误会导致出错退出。 v0.16
新增功能:在“导出图像”中,增加“包括子文件夹”选项。
功能增强:在“导出图像”中,如果“图像合并”选择“全部合并”,则自动处理带SMask参数的图像,但只能处理一层。
主要用于将从DjVu转换过来的PDF再转回图像,同时保持原始像素尺寸。
错误修正:某些CMYK色彩空间的JPG文件解码异常。
错误修正:转图像时,某些特殊PDF出错退出。 v0.15a
错误修正:某些PNG文件处理可能有问题。 v0.15
新增功能:“转回PDG”功能增加“批量转换”按钮。
错误修正:“转回PDG”功能处理JBig2压缩的图像有问题。
错误修正:“转为图像”中,忽略了JPG、JPEG 2000数据流使用Decode参数进行的反相显示。
错误修正:“文件结构”中,“导出xref”误用了“导出PDF结构”的结果文件。
错误修正:在“批量检查”页面中,如果“检查类型”选择了“文件结构”,检查完后另外两个选项状态不正确。 v0.14
功能增强:“转回PDG”功能支持分片的非黑白图像。
错误修正:某些CXPDF碎片太多,导致“转回PDG”功能出错退出。
错误修正:在“导出图像”功能中,如果选择了“分类合并”或“全部合并”,但未选择“包括页边”,对于某些strip图像可能出现错位。 v0.13
新增功能:在“转回PDG”页面中,增加“生成空白BookInfo.dat”选项,如果选中(缺省为选中),则生成空白的BookInfo.dat文件,否则不生成。
功能增强:在“导出图像”时,如果选择了“分类合并”或“全部合并”,并且未选择“包括页边”,则尝试对strip子图像按原像素尺寸进行合并。
功能增强:放宽PDF转PDG的限制。
错误修正:在“解密++”中,如果选择“压缩”,则原来的对象流会保留。
错误修正:某些单色图像右侧边界会出现竖线。
错误修正:提取PDF书签时,如果书签含特殊字符(如\r或\n),会造成书签截断。
误修正:在“书签相关”中,如果“书签初始状态”选择“折叠”或“展开”,则生成的PDF文件中的多级书签项不符合PDF规范要求,在某些浏览器下阅读可能有问题。 v0.12
功能增强:“转回PDG”处理黑白图像的速度有所加快。
错误修正:某些旋转过的图像不能正确导出。
错误修正:某些JPEG 2000调色板图像解码不准确。
错误修正:某些CXPDF不能转回PDG。 v0.11
新增功能:“转回PDG”功能兼容CX发行的PDF文件。 新增功能:各文件、文件夹选择框支持从资源管理器拖拽文件、文件夹。
新增功能:“转为图像”允许转为灰度PNG、灰度JPG。
功能增强:改进“转为图像”中的单色算法。
功能增强:在正则表达式输入对话框中,增加“帮助”按钮。
错误修正:“导出图像”功能中,有时黑白TIFF图像合并后成为黑底白字。 错误修正:在“转为图像”功能中,不能正确处理带/Mask数组的透明图像。
v0.10 功能增强:对含无效字符的文件路径能够给出提示。
错误修正:“页面宽度”、“书签相关”不能处理旋转过的页面。 错误修正:IJL不能正确解码某些含JFXX段的JPG文件。 zlib、IJG代码恢复原始版本,与IPP版说再见,以避免层出不穷的兼容性问题。
v0.09 新增功能:流导出,用于导出指定的流或内嵌文件。 新增功能:在“流过滤”中,增加“匹配此表达式的字典对象”、“字典匹配此表达式的流”、“匹配此表达式的流字典”选项,对原先的“字典对象”、“所有流”、“流对象字典”进行限制,避免误伤。 新增功能:“导出图像”新增“导出嵌入图像”选项。 功能增强:JPEG
2000解码改用Kakadu,以加快速度。 功能增强:JPEG编解码改用经过修正的IJL
2.0,以加快速度。 功能增强:zlib、IJG代码改用IPP优化版,以加快速度。 功能增强:支持某些书签格式非标的PDF。 错误修正:在简体中文Win7下,“转为图像”找不到外部字体“仿宋_GB2312”、“楷体_GB2312”。 错误修正:“导出图像”功能会漏掉CMYK色彩空间的JPEG
2000图像。 错误修正:“裁剪页面”不能正确处理旋转过的页面。
v0.08 功能增强:支持某些非标准PDF格式。 功能修正:去掉某些容易引起误会的警告信息。 错误修正:在“流过滤”中添加正则表达式时,所选“替换范围”与最终显示的“域”不一致。 错误修正:在“流过滤”中,如果选择了“所有流”,可能会对图像流进行过滤,造成图像损坏。 错误修正:在“流过滤”中,如果正则表达式替换出错,可能会造成内容丢失。 错误修正:在“流过滤”中,如果流太长,替换会出错。
v0.07 新增功能:“书签相关”,包括设置书签的初始状态、显示状态、点击后的缩放状态等。 新增功能:在“导出图像”中,增加“包括页边”选项,详见使用说明。 功能修正:在“导出图像”时,如果选择了“分类合并”或“全部合并”,则按最大子图像尺寸修正最终图像尺寸。 错误修正:在“导出图像”时,如果选择了“分类合并”或“全部合并”,黑白图像合并后右侧可能出现黑边。 错误修正:“流过滤”的记录有时会出现乱码。 错误修正:在“解密++”中如果选择了“放大率”,则文件打开后可能出错,或不能定位到第1页。
v0.06 新增功能:在“批量检查”中增加“检查类型”选项,在原来结构检查基础上增加页面检查功能,能模拟PDF浏览器解码过程对PDF进行检查。详见使用说明。 新增功能:“文档属性”中增加批量导入功能。 新增功能:“解密++”中增加“页面部局”、“放大率”选项。 新增功能:在“流过滤”中,允许对字典对象进行过滤。Catalog、Pages、Page等均属于字典对象,即整个对象就是一个字典。 新增功能:在“流对象”中,允许对所有流进行查找或替换,详见使用说明。 功能增强:在“导出PDF页面树”时,能导出更多、更准确的图像信息。 错误修正:不能处理含空对象的PDF。 错误修正:某些PDF裁边后成为一窄条。 错误修正:在设置页宽后,“承前缩放”的书签可能会错位。
v0.05 新增功能:“流过滤”中增加“查找”功能,可以用正则表达式对PDF进行搜索,并报告匹配的文件、对象、页码。 新增功能:“流过滤”中增加“留下记录”选项,选中后可以记录具体替换了哪些文件。 新增功能:“解密++”中增加“导览标签”选项,可以批量设置如何显示PDF的导览标签。 新增功能:“解密++”中增加“优化”、“恢复缺省参数”按钮,便于参数选择及恢复。 功能增强:避免某些耗时操作造成界面长期无响应。 功能增强:提高“页面宽度”的计算精度,避免出现白边。 功能增强:加强对“流过滤”中正则表达式的检查,争取在开始查找或过滤前先把不合格的表达式挑出来。 错误修正:“页面宽度”不能处理采用继承关系的矩形参数。 错误修正:设置页面宽度后,页面中的超链接位置错误。 错误修正:在“解密++”功能中,如果选择了“清除书签乱码”,某些文件在处理时会报错。 错误修正:如果页面流中含有inline
image,“流过滤”可能造成文件损坏。 错误修正:在某些极端巧合情况下,“流过滤”功能会出错退出。 错误修正:在“转为图像”时,某些含JPEG
2000图像的页面转换不正确。 对帮助文件中的缺失进行了补充。
v0.04 新增功能:“页面宽度”,将PDF所有页面设置为统一宽度,并等比例缩放页面内容。 新增功能:“流过滤”,可以对流对象字典、页面内容流进行正则表达式替换。
v0.03 新增功能:“批量检查”,可以批量检查PDF文件是否存在结构性错误。 新增功能:“解密++”,详见使用说明。 新增功能:“裁剪页面”,详见使用说明。 新增功能:加入“密码表”功能,对PDF密码进行统一管理。 新增功能:“导出图像”功能增加“图像合并”功能。 新增功能:“导出图像”功能增加“导出方法”选项。
v0.02
beta 新增功能:“文档属性”页,批量导出PDF文档属性。 新增功能:JBig2数据流导出为DjVu。 功能增强:可以生成CCITT
G4压缩的PDG文件。感谢coolman、hstong提供的编码算法和代码。 功能增强:对于非蒙板单色图,直接导出为TIFF而不是PNG。 功能增强:“转为图像”、“导出图像”增加批量功能。 错误修正:打开假冒PDF会出错退出。 错误修正:“转回PDG”时,碰到某些纯文字页面会出错退出。
v0.01 beta 功能增强:加强对索引色、背景色的支持。
v0.00
beta 实现转为图像、导出图像、转回PDG、文件结构。 |