一些图像格式转换工具的使用方法(eps2svg with pdf)

    xiaoxiao2021-04-17  41

    前言:

    工作中要把eps的图形转化为svg的,需要借助一些工具。

    首先,eps是Adobe公司开发的的用来印刷打印的图像格式,不是传统的位图,也不完全是矢量图。svg是完全的矢量图。很多工业中使用的印刷图像文件格式都是eps格式,但是要对其进行复杂的编辑操作时,要把图形转为svg导入,于是这就涉及到了一个图形格式转换的问题。用Adobe Illustrator可以很快的实现这个转换,但是这不是免费使用的,而且在其他公司开发的软件中也无法调用Adobe公司给出的任何接口,只能手动导入到AI中手动导出。在无法使用Adobe的格式转换方案的情况下,我们只能寻找一些其他方法。

    在windows和Linux的情况还是有区别的,现在网络上的大多数解决方案都是Linux下的,但是我们开发很多软件时,很多都是在windows下使用的,所以这里我简略总结一下windows环境下一些图形格式转换工具如何使用,以及如何将eps格式的转图形化为svg的。

    在Linux环境下:

    最佳的解决方案是先eps2pdf,然后pdf2svg。

    参考: https://superuser.com/questions/198460/converting-from-eps-to-svg-format

    这两种方法应该是都可以用的,但是可惜是在Linux的,没法用在windows。

    这里eps转pdf用的是GS,pdf转svg用的是Poppler和Cairo,这种方案在Linux下算是比较成熟的了,Poppler和Cairo我还没有研究过如何使用,这里暂时不介绍了。

    下面要介绍的几种工具是:Ghost Script 、Inkscape 、Potrace 、一个在Github上开源的js脚本(pdf2svg)

    Ghost Script:

    Reference: https://ghostscript.com/doc/current/Use.htm

    中文博客: http://blog.csdn.net/catoop/article/details/42737441

    这里给出一个将eps转化为pdf的事例

    命令: E:/path/gs/gs8.64/bin/gswin32c.exe -P -dNOPAUSE -dNOSAFER -dBATCH -dEPSCrop -sDEVICE=pdfwrite -sOutputFile=E:/path/1.pdf E:/path/1.eps

    这里中间很多参数,参考一下说明文档就行,简而言之就是将一个eps文件转化为了pdf,而且经过很多测试,这个转化过程非常完美。GS的sDEVICE=参数也有一个svg,我们将eps文件直接用GS转化为svg时,GS转化效果非常差,在一些有宽度的线条上,GS转出来的图形会有多余出来的东西,所以我们只用GS脚本实现eps2pdf。

    Inkscape:

    这个工具本来是一个在Linux开源的工具,直接sudo操作一通就能使用的,在Linux下可以只使用Inkscape很方便的转换文件格式,Inkscape将eps转为svg也是先用的GS将eps转为pdf,再用自己的工具将pdf转为了svg,在Windows版本的Inkscape是不支持eps文件格式的,只能将pdf转换为svg,除非安装了GS插件。在这里Inkscape的pdf2svg转换出来的效果非常棒,但是Inkscape的体积比较大,最新版本的压缩一下也要100mb,旧版本的也至少要50mb,所以不是很实用。

    参考文档:http://stackoverflow.com/questions/4120567/convert-pdf-to-svg

    命令语句: E:\Inkscape\inkscape.exe -l E:\output\out.svg E:\output\1.pdf

    Potrace:

    这就是一个将位图转化为svg的工具,只支持bmp等4种位图文件格式,png,jpg都不支持,而且转成svg效果也很差,它只是一个消除锯齿,让图像平滑的工具,转出来的图像不适合精确的编辑。

    使用方法在readme里有,语法大同小异,这里不赘述了。

    Github上开源的js脚本(pdf2svg):

    https://github.com/pramodhkp/pdf2svg/

    这个脚本非常小,但是需要用到Node.js 来运行这个脚本,加起来10mb。

    这个脚本把路径写死了,无论是文件生成路径还是文件保存路径,他都写的是"./xxx",都保存在了当下目录,如果你不加修改,就只能cd进到这个目录里,还不能直接从别的工作路径直接指定运行这个脚本。

    只能运行: node.exe pdf2svg.js in.pdf

    这时他会自动根据你pdf的页数生成很多svg文件,命名为in-1,in-2,in-3,生成文件的目录他也规定了。

    这里我修改了一下他的脚本,添加了两个参数,并且允许异地访问这个脚本。最后两个参数分别规定了这个脚本的工作路径(很多东西都生成在这里,也在这个路径里寻找,加个这个也便于修改脚本),和svg文件的输出路径。

    可以运行: C:\Users\Administrator>E:/pdf2svgmaster/node.exe E:/pdf2svgmaster/pdf2svg.js E:/pdf2svgmaster/in.pdf E:/pdf2svgmaster E:/out.svg

    综合解决方案:

    先用GS将eps转为pdf,再用nodejs运行这个开源脚本将pdf转为svg

    可能遇到的问题:

    1.图形大小在转换过程中变化

    在GS的参数里加上 -dEPSCrop 

    2.运行node.exe调用js脚本后,程序一直卡住

    一般的只要

    process->waitForFinished(Process_WaitMsecs);

    但是node很奇怪,会一直不退出。

    process->start(comandStr); process->waitForStarted(2000); process->waitForReadyRead(Process_WaitMsecs); QString retStr = process->readAll(); 因为js脚本会有命令行输出,所以我们等待它有返回结果的时候就读取文件,然后node程序就会异常退出。

    但是这里要注意一下,waitForReadyRead 只要发现程序有任何输出就会迅速执行,如果脚本中有一些console的无用信息输出,程序就会迅速读到底,在没有写入svg文件的时候,就读完了,后面就会找不到svg文件。所以我的解决方案是把js脚本中无用的输出全部注释掉,只留下写入文件后的那个console输出。

    转载请注明原文地址: https://ju.6miu.com/read-673846.html

    最新回复(0)