确保所有字体嵌入,是生成高质量学术论文的必要条件。但是在Windows下,总会遇到Matlab或Visio生成字体没有嵌入的问题,当然这个问题的解决办法有很多(例如,对于Visio可以这样做:直接拷贝到Adobe Illustrator(AI)中,另存为eps(选择为“为其他程序嵌入字体”)),这里介绍一种批量式的解决方法。看到有网友介绍,可以用GhostScript来进行来回转换。安装好GhostScript后,在其安装文件夹下的bin目录下,会有gswin64c.exe这个可执行程序(我这里是64位系统,32位系统对应的就是gswin32c.exe),把没有字体嵌入的eps文件拷贝至该目录下,运行:

gswin64c.exe -dNOPAUSE -dBATCH -dEPSCrop -q -sDEVICE=pdfwrite -dCompatibilityLevel#1.3 -dPDFSETTINGS=/prepress -dSubsetFonts=true -dEmbedAllFonts=true -sOutputFile=temp.pdf xxxx.eps

其中xxxx.eps就是需要转换的eps文件,这样生成了一个临时的temp.pdf文件,我们再运行下面的命令将临时pdf文件转为eps文件:

gswin64c.exe -q -dNOPAUSE -dBATCH -dNOCACHE -sDEVICE=epswrite -sOutputFile=yyyy.eps temp.pdf

其中yyyy.eps就是嵌入字体后的eps文件,通过这种方法,就可以将所有eps实现字体嵌入了。这样做固然方便,但是如果有很多文件需要处理,那手工运行命令还是挺复杂的。这里我提供一段简单的Java代码,我们可以将需要处理的eps文件都放在一个文件夹内,将文件夹拷贝到刚才说的bin目录下,在cmd方式下运行这段Java代码,可以批量实现转换(转换后的eps文件就在bin目录下,和原始文件文件名相同,但位置不同,这样可以方便LaTeX不进行任何修改就可以重新生成PDF)

import java.io.File;
import java.io.IOException;
 
public class gsBatch {
    public static void main(String[] args) {
        if(args.length!=1)
        {
            System.out.println("Usage: java gsBatch *Floder-to-handle*");
            System.exit(0);
        }
        String absoluteStartPath = System.getProperty("user.dir");
        File file = new File(absoluteStartPath+"\\"+args[0]);
        gsBatch t = new gsBatch();
        t.dotGenerator(file);
    }
 
    private void dotGenerator(File file) {
        // TODO Auto-generated method stub
        File[] fileList = file.listFiles();
        int i=0;
        while(i<fileList.length){
            if (fileList[i].isDirectory()==true){
                dotGenerator(fileList[i]);//使用递归方法对所有子目录分析
            }
            else if (fileList[i].getName().contains(".eps")){
                String relativePath = file.getPath();
                String commandConvertPDF = new String("cmd /c gswin64c.exe -dNOPAUSE -dBATCH -dEPSCrop -q -sDEVICE=pdfwrite -dCompatibilityLevel#1.3 -dPDFSETTINGS=/prepress -dSubsetFonts=true -dEmbedAllFonts=true -sOutputFile=temp.pdf  \""+relativePath+"\"\\"+fileList[i].getName());
                System.out.println(commandConvertPDF);
                String commandConvertEPS = new String("cmd /c gswin64c.exe -q -dNOPAUSE -dBATCH -dNOCACHE -sDEVICE=epswrite -sOutputFile="+fileList[i].getName()+" temp.pdf");
 
                try {
                    Runtime.getRuntime().exec(commandConvertPDF);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
 
                try{Thread.sleep(1000);}
                catch(Exception e){}
 
                try {
                    Runtime.getRuntime().exec(commandConvertEPS);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
 
                try{Thread.sleep(1000);}
                catch(Exception e){}
            }
            i++;
        }
    }
}

通过这种方法,就可以批量处理eps文件了(如果不会编译Java,则不用去考虑这种方法),最终生成的PDF文件可以用Acrobat等软件打开——文件——属性——字体,如果所有字体都显示“已嵌入子集”,则说明已经成功嵌入所有字体了。

Matlab,Visio等生成的图片的字体嵌入问题解决方法的更多相关文章

  1. EDAS字体嵌入问题解决方法

    提交IEEE EDAS文章时出现:“The paper PDF file cannot be accepted: Publishers require that PDF fonts are embed ...

  2. Ubuntu下部分Java软件字体渲染问题解决方法

    On ubuntu or in general Linux OS, fonts in some Java software(like Geogebra, Arduino) looks terriabl ...

  3. PHP 生成水印图片

    这段时间因工作需要,学习了下用PHP来给背景图上添加公司logo,宣传语之类的图片合并功能.话不多说,直接上代码. <?php public function getImage() { $dat ...

  4. java web学习总结(九) -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  5. JavaWeb---总结(九)通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片  1 package gacl. ...

  6. Java 生成验证码图片

    生成验证码图片并对提交的输入进行验证 // HttpServletResponse常见应用——生成验证码 // 利用BufferedImage类生产随机图片 public static final i ...

  7. javaweb学习总结(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  8. 012. asp.net生成验证码图片(汉字示例/字母+数字)

    protected void Page_Load(object sender, EventArgs e) { //生成验证码图片的基本步骤 string checkCode = "新年快乐& ...

  9. J2EE如何生成验证码图片和点击刷新验证码

    验证码图片生成步骤 创建BufferedImage对象. 获取BufferedImage的画笔,即调用getGraphics()方法获取Graphics对象. 调用Graphics对象的setColo ...

随机推荐

  1. jQuery Ajax异步处理Json数据详解

    先我们来看一个官方的实例使用 AJAX 请求来获得 JSON 数据,并输出结果: $("button").click(function(){ $.getJSON("dem ...

  2. mybatis通用DAO

    扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. 回复:茶爸爸了解他这个人!! 花了几天的时间研究了一下mybatis的源代码,觉得这 ...

  3. ACM高精度加减乘除模板

    [转]#include <iostream> #include <string> using namespace std; inline int compare(string ...

  4. X-UA-Compatible IE 浏览器默认文档模式设置

    制作网页的时候,IE8浏览器浏览页面的时候,有时候文档模式默认是IE7,导致IE8兼容性不是非常好.出现IE7应该出现的模式. 解决的方法例如以下: 在X-UA-Compatible中可用的方法有: ...

  5. 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件

    小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...

  6. Ubuntu设置为命令行登录

    root@ubuntu:~# vi /etc/default/grub 改: #GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMD ...

  7. sublime快捷方式和node.js

    快捷方式具体见:http://blog.useasp.net/archive/2013/06/14/sublime-text-2-all-default-Shortcuts-table-on-wind ...

  8. sql执行疑问

    遇到一个奇怪的事情,学习执行计划的时候写了这么一个sql来看执行计划的执行顺序, SELECT COUNT(*) FROM SIC84 WHERE AAC001 IN (SELECT AAC001 F ...

  9. vs2010如何打开vs2013

    vs2010如何打开vs2013 百度经验有,简单实用.

  10. Android GridView增加HeaderView和FooterView的实现

    Android GridView增加HeaderView和FooterView的实现 做的项目中遇到一个问题,需要实现一个页面 页面的上面是一个自定义的View和GridView,当向下滚动屏幕的时候 ...