【发布时间】:2014-05-23 11:42:33
【问题描述】:
我有一个简单的 Java 程序,它使用 iTextPDF 创建一个简单的“Hello World”文件,使用的字体不是 iTextPDF 原生的(COOPBL.TTF,直接来自 Windows)。
在 Windows 7-64 上运行,它运行良好并创建了一个 pdf 文件,文件中嵌入了 Cooper Black 字体的子集,反映在文件外观中。
在 Linux 上运行完全相同的类文件(无需重新编译),它不嵌入任何内容并使用 Helvetica。
这是程序:
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
public class iTextTest {
private void doit(String sOut) {
Document doc = new Document(PageSize.LETTER);
try {
FileOutputStream fOut = new FileOutputStream(sOut);
// Register a non-native font.
String sFontDir = ".";
int iResult = FontFactory.registerDirectory(sFontDir);
if(iResult == 0) {
System.out.println("TestPDF(): Could not register font directory " + sFontDir);
} else {
System.out.println("TestPDF(): Registered font directory " + sFontDir);
}
System.out.println(" Fonts registered:");
for(String sFont:FontFactory.getRegisteredFonts()) {
System.out.println(" " + sFont);
}
PdfWriter pdfWriter = PdfWriter.getInstance(doc, fOut);
doc.open();
XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
String htmlContent;
htmlContent = "<HTML><HEAD></HEAD><BODY>";
htmlContent += "<P style=\"font-family: cooperblack;\">";
htmlContent += "Hello World!";
htmlContent += "</P>";
htmlContent += "</BODY></HTML>";
helper.parseXHtml(pdfWriter, doc, new ByteArrayInputStream(htmlContent.getBytes()));
} catch(IOException e) {
e.printStackTrace();
} catch(DocumentException e) {
e.printStackTrace();
}
if(doc != null) {
doc.close();
}
}
public static void main(String[] args) {
if(args.length != 1) {
System.out.println("Usage: iTextTest outfile");
return;
}
iTextTest test = new iTextTest();
test.doit(args[0]);
}
}
我正在使用: itextpdf-5.5.0 xmlworker-5.5.0 视窗 Java 1.6.0_21 Linux Java 1.6.0_23
我会包含字体的副本和生成的 pdf,但看不到明显的方法。对于我的测试,我只是将 \Windows\fonts\COOPBL.TTF 复制到测试目录中,用于 Windows 测试和 Linux 测试。
对于它的价值: - 调整字体文件中的保护/属性标志没有区别。 - 我知道这不是公共领域字体。我只是用它来测试。
我对任何 cmets 都很感兴趣!
谢谢, 查克
【问题讨论】:
-
您定义了
String sFontDir = ".";,但与Linux 相比,Windows 上的"."会有所不同。请将"."的绝对路径写入System.out,我很确定这不会是您在Linux 上所期望的。您必须将COOPBL.TTF文件移动到 Linux 返回的路径。 -
谢谢,Bruno,我尝试了 getPath、getAbsolutePath 和 getCanonicalPath,并且在两个操作系统上都返回了我从中运行测试的当前目录的预期结果。请注意,我在调用 registerDirectory() 后列出了注册的字体。根据 FontFactory.getRegisteredFonts(),字体文件正在被注册,我正在使用它的一个化身(cooperblack)的确切名称。
-
这很奇怪。我以前从未见过这个问题。我在 Windows 和 Linux 上运行所有示例。要解决这个问题,我需要能够重现它,但我不能。
标签: linux pdf fonts itext embedding