在模板中生成条形码以与Apache FOP一起使用

时间:2013-08-14 19:46:43

标签: barcode xsl-fo apache-fop

我正在开发一个项目,该项目通过另一个软件输出的xml数据生成PDF格式的发票,这些发票的一个要求是为某些节点数据创建条形码并将它们放在表单中。理想情况下,条形码将从模板内部生成,而不是调用另一个程序来生成条形码,然后让模板尝试将它们作为PNG或其他图像格式查找。

我尝试过使用barcode4j扩展程序,但没有结果。

<?xml version="1.0" encoding="UTF-8"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"  xmlns:barcode="http://barcode4j.krysalis.org/ns" font-size="10pt">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="master0" page-width="21.0cm" page-height="29.7cm" margin-top="0.0cm" margin-bottom="0.5cm" margin-left="0.5cm" margin-right="0.25cm">
      <fo:region-body region-name="body0" margin-top="0.5cm" margin-bottom="0.5cm"/>
      <fo:region-before region-name="header0" extent="1.5cm"/>
      <fo:region-after region-name="footer0" extent="1.89cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="master0">
    <fo:flow flow-name="body0">
    <xsl:variable name="CheckMaster" select="count(master_bill_of_lading/details/orders/order)"/>
    <xsl:variable name="country" select="master_bill_of_lading/header/Country"/>

  <xsl:variable name="barcode-cfg">
        <barcode>
            <code39>
                <height>16mm</height>
                <module-width>0.3mm</module-width>
                <human-readable>
                    <placement>none</placement>
                </human-readable>
            </code39>
        </barcode>
        </xsl:variable>

   <fo:block>

 <fo:instream-foreign-object>
<xsl:variable name="bc" select="barcode:generate($barcode-cfg, 123456)" />
   <xsl:copy-of select="$bc" />
 </fo:instream-foreign-object>

    ...     

除了试过这个之外,任何允许我在模板中生成条形码的解决方案都会受到极大的赞赏,因为要找到对所谓解决方案的一致的在线参考是非常困难的。

编辑:我能够使用FOP扩展barcode4j解决这个问题,只需要将包含的jar添加到FOP内的路径和lib文件夹中,然后在内部创建一个条形码fo:instream-foreign-object block

2 个答案:

答案 0 :(得分:5)

大多数1d条形码都受到RenderX免费提供的XSL样式表的支持,这些样式表可以在XSL到SVG中动态处理条形码。见RenderX Barcode XSLs。这包括您的示例显示的3个9条形码。

答案 1 :(得分:0)

条形码只是带有特殊字体的文字。获取所需条形码类型的TrueType条形码字体。并在fop.xconf fonts部分中将条形码字体添加到FOP:

    <font kerning="yes" embed-url="free3of9.ttf">
      <font-triplet name="barcode" style="normal" weight="normal"/>
    </font>

在你的喜欢中使用它:

<fo:block
  font-family="barcode"
  font-size="36pt"
>*12345678*</fo:block><!-- YMMW with the * -->

这是一个使用FOP 1.1的旧项目,我猜它应该在较新版本的FOP中类似。