gpt4 book ai didi

css - @font-face 与 Flying Saucer

转载 作者:技术小花猫 更新时间:2023-10-29 11:20:17 28 4
gpt4 key购买 nike

我希望有人能帮助我……看起来我想做的应该相当简单,但我已经为这件事奋斗了一天多了,但我没有想法。我在 StackOverflow 和整个 Internet 上找到了很多信息,但都没有帮助我解决这个问题。

我正在尝试使用 itext-2.0.8 和 core-renderer-R8 来创建带有嵌入式字体的 PDF。我正在尝试从有效的 XHTML 生成 PDF,并使用 @font-face 样式标签嵌入字体。我已通过在浏览器中打开文件确认 @font-face 标签包含字体。而且我总是小心地保持 TTF 文件相对于 XHTML/CSS 文档。

为了尝试解决这个问题,我创建了一个“Hello World”类型的小程序来尝试嵌入字体。我采取了两种不同的方法,但都未能产生预期的结果。我在 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-face {

font-family: 'MisoRegular';

src: url("miso-regular-webfont.ttf");

-fs-pdf-font-embed: embed;

-fs-pdf-font-encoding: Identity-H;
}

现在我觉得这是一个非常常见的用例,我想我只是没有执行一个简单的步骤来让它工作......问题是我已经这样做了一段时间并且认为我无法透过树木看到森林。任何人都可以提供给我的任何帮助将不胜感激。感谢您的宝贵时间。

最佳答案

我在使用 Flying Saucer 时遇到过问题,字体似乎没有正确嵌入,结果是我尝试嵌入的字体已损坏或至少不完整。缺少有关字体系列和描述的属性。当我尝试在 OS X 上使用 FontBook 中的验证文件选项验证我的字体时,我立即收到警告:

  • 'name' 表可用性
  • 'name'表结构

然而,FlyingSaucer 默默地失败了,只是继续将 Times-Roman 和 Times-Bold 作为默认字体嵌入。当我尝试使用通过 FontBook 验证的字体时,我发现该字体已正确嵌入。

我花了数小时试图增加 FlyingSaucer 日志记录的冗长程度以获取更多信息,但直到我逐步完成整个渲染过程并恰好注意到 FontFamily 在加载字体后的调试器,它不包含我希望它注册的名称。

底线: 如果您在使用 FlyingSaucer 和字体时遇到问题并且用头撞墙,请确保您的字体有效。

关于css - @font-face 与 Flying Saucer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323480/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com