Matlab,Visio等生成的图片的字体嵌入问题解决方法
确保所有字体嵌入,是生成高质量学术论文的必要条件。但是在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等生成的图片的字体嵌入问题解决方法的更多相关文章
- EDAS字体嵌入问题解决方法
提交IEEE EDAS文章时出现:“The paper PDF file cannot be accepted: Publishers require that PDF fonts are embed ...
- Ubuntu下部分Java软件字体渲染问题解决方法
On ubuntu or in general Linux OS, fonts in some Java software(like Geogebra, Arduino) looks terriabl ...
- PHP 生成水印图片
这段时间因工作需要,学习了下用PHP来给背景图上添加公司logo,宣传语之类的图片合并功能.话不多说,直接上代码. <?php public function getImage() { $dat ...
- java web学习总结(九) -------------------通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- JavaWeb---总结(九)通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl. ...
- Java 生成验证码图片
生成验证码图片并对提交的输入进行验证 // HttpServletResponse常见应用——生成验证码 // 利用BufferedImage类生产随机图片 public static final i ...
- javaweb学习总结(九)—— 通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- 012. asp.net生成验证码图片(汉字示例/字母+数字)
protected void Page_Load(object sender, EventArgs e) { //生成验证码图片的基本步骤 string checkCode = "新年快乐& ...
- J2EE如何生成验证码图片和点击刷新验证码
验证码图片生成步骤 创建BufferedImage对象. 获取BufferedImage的画笔,即调用getGraphics()方法获取Graphics对象. 调用Graphics对象的setColo ...
随机推荐
- [lua]笔试-按字典序列出指指定的序列的位置
计算方法: n的阶乘记为f(n), s为输入序列, sub(i)为s的i到n的子序列.A(i)为第i位对应的字母在子序列sub(i)中的字典顺序 N(s) = sum_{1,n} T(i)*(A(i) ...
- FMDB的基本应用
FMDB简介 iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较频繁.于是,就出现了一系列将AQLite API进行封装的库,例如FMDB.PlausibleDa ...
- 在优化SQL语句中使用虚拟索引
定义:虚拟索引(virtual index) 是指没有创建对应的物理段的索引. 虚拟索引的目的:是在不损耗主机CPU,IO,磁盘空间去实际创建索引的情况下,来判断一个索引是否能够对SQL优化起到作用. ...
- 【JUnit4.10源码分析】5 Statement
假设要评选JUnit中最最重要的类型.或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.ru ...
- Sqoop处理Clob与Blob字段
[Author]: kwu Sqoop处理Clob与Blob字段,在Oracle中Clob为大文本.Blob存储二进制文件. 遇到这类字段导入hive或者hdfs须要特殊处理. 1.oracle中的測 ...
- ceph操作相关命令整合
ceph基本操作: /etc/init.d/ceph -a start/stop //即在所有节点上执行 单个操作: start/stop ceph-osd id={id} start/stop ce ...
- C++赋值函数详解
赋值函数 每个类只有一个赋值函数 由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视. 1,如果不主动编写拷贝构造函数和赋值函数,编译器将 ...
- Xcode 静态库调试策略
Xcode 静态库调试策略 (已经有现成的工程和静态库源码) ***** 为安全期间建议备份一下静态库 Step1: 下载最新的工程[工程中有所要测试的静态库和头文件需要删除]: Step2: ...
- Handler没法取出消息队列中的数据的一个原因
主线程发送消息到工作线程,工作线程的步骤是固定为3步的. Looper.prepare();//步骤1,线程里使用handler必须这样写, handler = new Handler(){//步骤2 ...
- ContentProvider的一些总结
ContentProvider中的URI, The URI that identifies the provider 一个特定的uri对应着唯一一个内容提供者, 谷歌官方文档里的说明, Query ...