我希望有人可以帮助我……看来我要做的事情应该很简单,但是我已经为这个事情奋斗了整整一天,而且没有想法。我已经在StackOverflow和整个Internet上找到了很多信息,但是没有什么可以帮助我解决此问题。
我正在尝试将itext-2.0.8与core-renderer-R8一起使用来创建具有嵌入式字体的PDF。我试图从有效的XHTML生成PDF,并使用@ font-face样式标签嵌入字体。我已经通过在浏览器中打开文件来确认@ font-face标记包括字体。而且我总是小心翼翼地保持TTF与XHTML/CSS文档相对应。
为了尝试以这种方式工作,我创建了一个小的“Hello World”类型程序来尝试嵌入字体。我采用了两种单独的方法,但两种方法均无法产生预期的结果。我将这个小Eclipse程序的副本放置在http://christopherluft.com/FlyingSaucer.zip中
该程序在这两种情况下都生成PDF,但是没有嵌入预期的PDF。将文件与setDocument一起使用的第一种方法不会产生错误,但也不会产生字体。第二种方法生成PDF,但在调试输出中显示java.net.MalformedURLException。
我已经尝试了各种路径和URL的多种排列;但是,没有人会产生预期的结果。我的怀疑是我对ITextRenderer.setDocument不了解。但是,我很难找到适用于我的用例的任何适当文档。
我尝试的第一种方法是:
public static void main(String[] args) throws IOException, DocumentException {
System.getProperties().setProperty("xr.util-logging.loggingEnabled",
"true");
XRLog.setLoggingEnabled(true);
String inputFile = "sample.xhtml";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "firstdoc.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
os.close();
}
我正在使用的第二种方法(更接近我们在应用程序中使用它的实际方法)是:
public static void main(String[] args) throws IOException, DocumentException {
System.getProperties().setProperty("xr.util-logging.loggingEnabled", "true");
XRLog.setLoggingEnabled(true);
String inputFile = "sample.xhtml";
String url = new File(inputFile).toURI().toURL().toString();
DocumentBuilder documentBuilder;
org.w3c.dom.Document xhtmlContent;
try
{
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
documentBuilder.setEntityResolver(new XhtmlEntityResolver(new SuppressingEntityResolver()));
xhtmlContent = documentBuilder.parse(url);
System.out.println(url);
String outputFile = "firstdoc.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(xhtmlContent,".");
renderer.layout();
renderer.createPDF(os);
System.out.println("Finishing up....");
os.close();
}
catch (SAXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ParserConfigurationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
XHTML中的@ font-face包含如下所示:
@font-face {
font-family: 'MisoRegular';
src: url("miso-regular-webfont.ttf");
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}
现在,我觉得这是一个非常普遍的用例,我想我只是无法执行一个简单的步骤就可以使它正常工作...问题是我已经有一段时间了,并认为我是无法透过树木看到森林。任何人都可以提供给我的帮助将不胜感激。感谢您的时间。
最佳答案
我在飞碟上遇到了问题,似乎字体没有正确嵌入,结果是我尝试嵌入的字体损坏或至少不完整。缺少有关字体系列和描述的属性。当我尝试在OS X上使用FontBook中的Validate File选项来验证我的字体时,立即出现警告,提示:
但是,FlyingSaucer默默地失败了,只是继续嵌入Times-Roman和Times-Bold作为默认字体。当我尝试使用通过FontBook验证的字体时,我发现该字体已正确嵌入。
我花了几个小时试图增加从FlyingSaucer进行日志记录的详细程度,以获取更多信息,直到逐步完成整个渲染过程,才发现情况确实如此,只是偶然发现加载后调试器中FontFamily设置为“”字体,并且其中不包含我希望以其注册的名称。
底线:如果您在FlyingSaucer和字体方面遇到问题,并且将头撞在墙上,请确保您的字体有效。
关于css - @ font-face与飞碟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10323480/