我在跳有人能帮我..。似乎我想做的事情应该是相当简单的,但我已经为这件事斗争了一天多了,已经没有想法了。我在StackOverflow和互联网上找到了很多信息,但是没有什么帮助我解决这个问题。
我正在尝试使用itext-2.0.8以及核心渲染器-R8创建一个带有嵌入式字体的PDF。我试图从有效的XHTML生成PDF,并使用@字体样式标记嵌入字体。我已经确认@字体面板标签是通过在浏览器中打开文件来包含字体的。我总是小心地保持TTF字段相对于teh /CSS文档。
为了尝试和工作方式通过这一点,我已经创建了一个小的'Hello‘类型的程序,试图嵌入字体。我采取了两种不同的办法,但都未能产生预期的结果。我在http://christopherluft.com/FlyingSaucer.zip放了一份Eclipse程序的副本
该程序在这两种情况下都生成一个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-family: 'MisoRegular';
src: url("miso-regular-webfont.ttf");
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}现在,我觉得这是一个非常常见的用例,我想我只是没有执行一个简单的步骤,以使这个工作。问题是,我在这里已经有一段时间了,我认为我无法透过树木看到森林。任何人能为我提供的任何帮助都将不胜感激。谢谢您抽时间见我。
发布于 2012-04-27 02:10:21
我曾经经历过飞碟的问题,似乎字体没有被正确的嵌入,结果是我试图嵌入的字体已经损坏或者至少不完整。缺少有关字体家族和描述的属性。当我尝试在OS上使用FontBook中的Validate选项验证我的字体时,我立刻收到了警告:
表usability
然而,FlyingSaucer默默地失败了,只是继续使用嵌入Times和Times作为默认字体。当我尝试使用通过FontBook验证的字体时,我发现字体是正确嵌入的。
我花了几个小时试图增加来自FlyingSaucer的日志记录的冗长性,以获取更多的信息,直到我逐步完成整个呈现过程,我才发现情况是这样的,只是碰巧注意到,在加载字体之后,FontFamily设置为"“在调试器中,并且它没有包含我希望它注册的名称。
的底线:,如果你对FlyingSaucer和字体有问题,并且把头撞在墙上,确保你的字体是有效的。
发布于 2020-09-15 11:22:26
我也面临着一个类似的问题,字体没有被应用到最终的pdf中,而m4t关于调试的建议确实帮助我识别了这个问题,所以谢谢你!
就我的情况而言,实际上有两个问题:
@font-face规则的一部分指定的src属性有两个值,即url和格式。它看起来有点像@font-face {
src: url("../../static/fonts/OpenSans-Regular.ttf") format("ttf");
}由于第二个值format,CSSParser中断,导致src属性完全被悄悄跳过。因此,在进一步处理时,呈现不知道从哪里选择字体。一旦我从值中删除了format部件,问题就得到了解决。
setDocumentAsString时没有显式指定(可选的第二个参数) baseUrl。我通过使用类加载器显式地在代码中加载静态资源的uri来解决这个问题,然后将其设置为基本url。更改后,字体文件的路径被成功解析并应用到我的pdf中。这里需要注意的是,提供给
的基本url必须是URI (文件:/
setDocumentAsString/structure/static/),并且必须以尾随斜杠('/')结尾。否则,文件和url不能得到正确的解析。
希望这对面临类似问题的人有所帮助。
https://stackoverflow.com/questions/10323480
复制相似问题