Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2358620
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类:

2005-08-04 17:47:55

超星的PDG文件格式一直是为人所诟病的, 至少是为我所诟病的, 所以想舒舒服服看文档的话就要把它转换成PDF, 想识别成文字是太奢侈了. 我所说的转换成PDF也只是把每一页内容当作一个图像文件, 然后再将每一页对应的图像文件收集转制成单一的PDF文件. 很显然这个过程需要自动化.
首先我用的超星阅读器是未注册版的, 它只让我看17页, 不能打印. 这样我就不能通过PDFWriter这样的虚拟打印机来转制.
好在多日前琢磨这个工具的时候我就找到过一个工具: pdg2bmp.exe, 顾名思义, 它把超星的文件格式转换成BMP, 实际上它还能转换成JPG格式.

这个工具可以批量转换, 但它有两个显然的缺点, 一是文件过多时程序表现有BUG, 现象是CPU占用率极高, 同时没有新的图像文件转制成功.
这时候只能把它干掉重来. 二是你在添加整个目录时它识别该目录中要转换的文件列表完全靠扩展名, 而实际超星有时候不用PDG作文件名, 而往往用001, 002这样的
名字作为扩展名. 也许是故意迷惑大家的. 文件很多时就需要有一些技巧来把这些文件名改成.PDG了. 我的最爱是VIM, 用它得到整个文件列表, 一个替换命令搞定.
存为一个批处理文件. 运行即可.
关于pdg2bmp.exe的BUG不知道作者改正了没有, 我目前的方法是把进程杀掉重新来. 失败率不是很高, 可以忍受.

接下来是把生成的BMP文件都转成ps格式. 转成ps格式的目的是可以把多个ps格式合成为一个, 最终目的是合成为单一的PDF文件, 说到这里就有小的细节了.
象ImageMagick这样的工具可以把BMP直接转换成PDF, 而Acrobat也具备合并多个PDF文件为一个的能力, 为什么不这样用呢, 这是因为Acrobat有一些鲜为人知的
BUG: 一次能插入的PDF文件的数量是有限制的, 也就是说放在文件名那个输入框的字符数是有限制的, 这个烂帐未必要算到Adobe的头上, 文件对话框是微软做的,
但Adobe也完全可以用另外的办法来读取文件列表, 总之, 这里是一个问题. 如果说这个问题也可以忍受, 那接下来的BUG就孰不可忍了, Acrobe会弄乱插入文件的顺序
, 在以前的Acrobat 5中我就发现了这个问题, 直到现在用的版本 7也还是依旧, 而且以前我还自以为聪明地找到了绕过它的办法, 那就是用vim把文件顺序排好, 然后COPY
到文件名对话框里, 因为我发现它实际插入的文件顺序是文件名从左到右出现顺序的反序. 现在我发现这个小聪明也不管用了. 总之这个部分是不可靠的. 用Acrobat
手工合并10个以内的PDF文件没什么, 多达几百个PDF文件时就受不了了.

闲话不表, 接下来是用ImagicMagick来转换BMP到 ps文件.
convert 001.bmp 001.ps
我是在linux下转换的, 这样对多个文件可以这样:
date; for i in *.bmp;do convert $i ${i/bmp/ps};done; date
前后加上时间是为了以后心中有数.

然后是合并多个PS文件为单一的PS, 我在google上搜索"pdf merge multi"时找到下面的办法, 牛人们写了一个PS脚本, 然后把自己的PS
文件简单地罗列中文件最后就可以了, 为了引述方便, 下面用====BEGIN====. .... =====END====之间出现的文件内容假设存为一个
my_merge.ps
==========================BEGIN============================
%!PS
% Written by Helge Blischke, see
%
%
% The following 2 procs encapsulate the jobs to be processed
% much as is done with EPS images:
/_begin_job_
{
/tweak_save save def
/tweak_dc countdictstack def
/tweak_oc count 1 sub def
userdict begin
}bind def

/_end_job_
{
count tweak_oc sub{pop}repeat
countdictstack tweak_dc sub{end}repeat
tweak_save restore
}bind def
=========================END=============================
这样的ps文件不算完整, 还要把自己的ps文件整合进去:
date; for i in *.ps; do echo -e "_begin_job_ (${i})run _end_job_" >> my_merge.ps; done; date
目的是对于每一个PS文件, 都生成下面的3句话
_begin_job_
(001.ps)run
_end_job_
码齐放在文件结尾, 这句话中要小心 >> 不能写成>哦, 另外 echo -e可以让内嵌在""中的 被解释为换行符.
前后的date还是为了积累经验, 以便以后干类似的事时可以从容地决定是去吃饭还是看碟来消磨这段时间.

好了:
ps2pdf my_merge.ps
大功告成!
只是要把生成的my_merge.pdf 改名.

可能这样过程中还是有需要注意的地方的, 我这次的例子是选择了生成黑白BMP图像, 这样生成的BMP文件小, 而且我简单地分析认为PDG文件中出现的内容
都是单色的, BMP应该是经济实惠的, 实际上这会影响转换后的ps以及最后的PDF的质量. 用画笔单独作了个BMP文件作测试, 发现确实如此.

PS: ps2pdf 在 postscript 这个RPM包中, convert在 ImageMagick这个包中. 要确保已经安装.
阅读(1992) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~