【问题标题】:How I use a custom font with the Batik SVG library?我如何在 Batik SVG 库中使用自定义字体?
【发布时间】:2013-10-07 04:19:41
【问题描述】:

我正在开发一个为衣服创建模板的 Java 程序。用户输入他们想在服装上看到的单词,系统会创建一个 PDF 模板。为了创建模板,我以编程方式创建了一个 SVG 文档,然后使用 Batik 将 SVG 转码为 PDF 格式。

我的客户现在希望能够使用自定义字体来创建模板。我想知道是否可以在 Batik 转码器中使用像 TTF 这样的字体?如果是这样,您将如何设置 SVG?

【问题讨论】:

    标签: java svg truetype batik


    【解决方案1】:

    首先,您需要使用 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希望它有所帮助。

    【讨论】:

    • 无需将字体转换为 SVG。 Batik 可以使用 TrueType 字体显式操作。只需添加类似这样的 CSS 声明:@font-face { font-family:'Your Font Family'; src: url('fonts/yourfontfile.ttf') 格式('truetype'); }
    • @Jiří Vypědřík:您能否详细说明如何在 Batik 中使用 css 为 SVG 添加自定义字体?我在谷歌上找不到一个例子。 (实际上向 Batik 添加任何 CSS 几乎是不存在的)
    • 如果我在一个文件夹中拥有所有 *.ttf 字体,我可以全局注册它们,以便它们可用于 PNGTranscoder 和 PDFTranscoder 吗?我已经玩了好几天了,除了在 SVG 本身的本地文件中添加 font-face-uri 之外,还没有任何东西可以工作。到目前为止,wiki.apache.org/xmlgraphics-fop/SvgNotes/… 在使用 <directory> 时对我不起作用,即使仅使用 FOP 的类似配置也有效。
    • @jon_wu 你找到答案了吗?我也有同样的问题。
    • 我有一个概念证明,可以使用 FOP 2.2-SNAPSHOT 和 Batik 1.8 将 SVG 转换为 PDF。基本上,创建一个new PDFTranscoder,然后使用为所有字体指定<directory> 的XML 配置对其进行配置。自从我写了评论以来,我想我正在尝试一个新的更干净的 Play stack 和更新的版本,所以也许这会有所帮助。 FOP 2.2 也刚刚发布。
    【解决方案2】:

    只需添加以下元素作为<svg/> 的子元素:<style type="text/css"> 然后,类似于 HTML...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2013-01-14
      • 2021-07-12
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多