【发布时间】:2013-10-07 04:19:41
【问题描述】:
我正在开发一个为衣服创建模板的 Java 程序。用户输入他们想在服装上看到的单词,系统会创建一个 PDF 模板。为了创建模板,我以编程方式创建了一个 SVG 文档,然后使用 Batik 将 SVG 转码为 PDF 格式。
我的客户现在希望能够使用自定义字体来创建模板。我想知道是否可以在 Batik 转码器中使用像 TTF 这样的字体?如果是这样,您将如何设置 SVG?
【问题讨论】:
我正在开发一个为衣服创建模板的 Java 程序。用户输入他们想在服装上看到的单词,系统会创建一个 PDF 模板。为了创建模板,我以编程方式创建了一个 SVG 文档,然后使用 Batik 将 SVG 转码为 PDF 格式。
我的客户现在希望能够使用自定义字体来创建模板。我想知道是否可以在 Batik 转码器中使用像 TTF 这样的字体?如果是这样,您将如何设置 SVG?
【问题讨论】:
首先,您需要使用 batik 的 ttf2svg 将字体文件从 TTF 转换为 SVG,一旦您拥有转换后的文件,您必须在 SVG 文档的“defs”部分添加参考。 我就是这样做的:
Element defs = doc.createElementNS(svgNS, "defs");
Element fontface = doc.createElementNS(svgNS, "font-face");
fontface.setAttributeNS(null, "font-family", "DroidSansRegular");
Element fontfacesrc = doc.createElementNS(svgNS, "font-face-src");
Element fontfaceuri = doc.createElementNS(svgNS, "font-face-uri");
fontfaceuri.setAttributeNS(svgNS, "xlink:href", "fonts/DroidSans-webfont.svg#DroidSansRegular");
Element fontfaceformat = doc.createElementNS(svgNS, "font-face-format");
fontfaceformat.setAttributeNS(svgNS, "string", "svg");
fontfaceuri.appendChild(fontfaceformat);
fontfacesrc.appendChild(fontfaceuri);
fontface.appendChild(fontfacesrc);
defs.appendChild(fontface);
svgRoot.appendChild(defs);
在创建文本元素时,像设置任何其他字体一样设置字体系列
Element txtElem = doc.createElementNS(svgNS, "text");
txtElem.setAttributeNS(svgNS, "style", "font-family:DroidSansRegular;font-size:" + fontsize + ";stroke:#000000;#fill:#00ff00;");
txtElem.setTextContent("some text");
svgRoot.appendChild(txtElem);
我从这篇文章中得到了信息:http://frabru.de/c.php/article/SVGFonts-usage希望它有所帮助。
【讨论】:
font-face-uri 之外,还没有任何东西可以工作。到目前为止,wiki.apache.org/xmlgraphics-fop/SvgNotes/… 在使用 <directory> 时对我不起作用,即使仅使用 FOP 的类似配置也有效。
new PDFTranscoder,然后使用为所有字体指定<directory> 的XML 配置对其进行配置。自从我写了评论以来,我想我正在尝试一个新的更干净的 Play stack 和更新的版本,所以也许这会有所帮助。 FOP 2.2 也刚刚发布。
只需添加以下元素作为<svg/> 的子元素:<style type="text/css"> 然后,类似于 HTML...
【讨论】: