关于 php pdf转png的解决方案。

     忙忙碌碌了几天的时间,终于把项目pdf转png所遇到的一些问题搞的差不多了, 趁空闲时间把自己遇到的一些坑和大家分享下。 网上关于php pdf转png的解决方案有的很简单的就说了下 用ImageMagic 读入pdf,然后传入参数进行转,对与大多数没有接触过这方法需求的同学,可能会误认为ImageMagic会直接将pdf转为png, 所以就会造成装好了ImageMagic 和imagic 扩展,却怎么也转不出来的情况。这里有个很重要的注意点就是,ImageMagic 并不会直接处理pdf, 它只是处理图片,并不会直接处理pdf, 而网上直接读pdf的例子其实是 通过 ImageMagic 调用 GhostScript 这个东西去进行pdf转换的。GhsotScript专门给编程人员提供的一个转换pdf的工具,大家可以把它想象成桌面版Adobe Acrobat就行了, 那么执行流程就是 php 通过 Imagic 扩展去调用ImageMagic,ImageMagic去调用 GhostScript 将pdf转换为 png,接着 ImageMagic对png进行处理, 至于GhostScript怎么安装大家自己百度百度就明白了。

     接下来主要说说GhostScript 转pdf 遇到的一些字体问题。首先简单说说个人对于GhostScript加载字体流程的一些理解,可能不准确,希望大家理解。GhostScript读取到pdf的字体描述后,会从字体描述文件查找对应的字体,也就是cidfmap这个文件。由于Adobe 大量使用了CID字体,并不是我们平常用的ttf字体,至于什么原因呢,可能是Adobe自己想建立标准吧,当我们尝试通过GhostScript转含有 不同字体的pdf时,它会提示类似下方的这些信息.

关于 php pdf转png的解决方案。关于 php pdf转png的解决方案。

关于 php pdf转png的解决方案。

关于 php pdf转png的解决方案。

提示信息写的很明白,明确的告诉我们缺少 方正兰亭等等中文CID字体, 然后它就会去自己找个字体去代替,这时它找的是Adobe-GB1 这个字体去替换,接着发现 Adobe-GB1这个字体也不存在,接着它又去找一个DroidSansFallback字体,最后用这个字体去替换,造成的结果就是转出来的图片字体不对劲了,和原来的pdf对不上了。字体变了对于媒体出版物是绝不允许的。好了,问题找到了,那么就是怎么把字体给它弄过来了, 文档写着 gs -h 就可以看到 gs字体搜索路径

关于 php pdf转png的解决方案。关于 php pdf转png的解决方案。

关于 php pdf转png的解决方案。

可以看到 搜索路径是 %rom%Resource/Init/ 等等,可是%rom是什么呢,接着看官方文档(一定要看对应版本的文档,不能用8.XX的文档去 用9.XX的 gs),文档的大概意思就是%rom 是个环境变量,可以设置这个环境变量来指定位置,但还要一个办法就是不用这个环境变量,那就是编译时,把Makefile 文件中的 COMPILE_INIT = 1 改为 0 ,这样编译的时候就不会用这个环境变量了,更改后,重现编译了下,我们再看看它的搜索路径。

关于 php pdf转png的解决方案。关于 php pdf转png的解决方案。

注意这个搜索位置非常重要,如果设置不对,会出现配置好字体文件映射后,依然找不到字体的问题。

    字体配置文件 cidfmap在 Resource/Init 中,在这个文件我们来配置字体映射,官方文档提供了三种配置方式,每种方式针对一种情况,我们只看 用ttf字体映射,下面是我配置的一个字体映射,/FZLTZHUNHK_HBBY--GBK1-0 是要映射的字体名,/FileType是 字体文件类型,ttf文件就写/TrueType,/Path是字体文件存放路径, /SubfontID 是针对ttc字体文件选取的,因为ttc文件是几个ttf文件的集合, 所以要选择用哪和文件,如果是ttf文件,直接写0就行,后面的 GB1 2 表示 中文简体,至于繁体什么的大家可以仔细阅读官方文档,ttf文件映射大概就是这样子了。

关于 php pdf转png的解决方案。

字体文件配置好之后,进行转换

关于 php pdf转png的解决方案。关于 php pdf转png的解决方案。关于 php pdf转png的解决方案。


 可以看到GhostScript顺利加载了我们配置的字体,接着查看了下效果,并且个 Adobe Acrobat转换出来的对比了下,非常完美。后面还发生了特别郁闷的事,虽然现在转换出来的字体非常完美,但有些特殊符号,竖着的中文字体转换出来的方向出错了,就像这样。
关于 php pdf转png的解决方案。


关于 php pdf转png的解决方案。     找了几天问题,头都大了, 始终没找出原因,后来怀疑是不是 GhostScript 的bug,没有对中闻垂直水平符号进行判断,接着给GhostScript项目组发了封邮件报告了这个情况,果然是他们的问题,确实对中文这块没做处理,从8.00到9.0以上版本都存在这个问题,后来GhostScript项目发挥一个修改后的版本,经测试完美可用。修改后版本的址 http://git.ghostscript.com/?p=ghostpdl.git;a=commitdiff;h=7dd033589c,遇到中文特殊符号转换问题,可以用这个版本进行解决

关于 php pdf转png的解决方案。   

    好了,就这么多了,虽然搞的头昏脑胀,但解决问题后还是很爽的,干这行不就是为了这种感觉吗?希望大家遇到难以解决的问题一定要冷静,仔细分析,不要做俩步发现不行就吵着换方案,坚持就会获得胜利。