0

我想在 PDF 中嵌入动态图表或图形,它应该具有排序、向下钻取、分组依据、展开折叠等功能。我正在考虑的一个选项是从 XML 文件在 Flash SWF 中创建动态图表,然后将此 SWF 嵌入为以及 PDF 格式的 XML 文件。我知道我们可以使用 iText 在 PDF 中嵌入 SWF。但是如何在 PDF 中同时嵌入 SWF 和 XML。这行得通吗?我的另一个问题是,除了 SWF+XML 组合之外,是否还有其他选项可用于创建带有免费或低成本的动态图表或图形的 PDF。这对 JasperReports 或 BIRT 或 Pentaho 或 FusionCharts 是否可行?我可以在 PDF 中嵌入动态 FusionCharts 吗?

谢谢,

瓦普劳

4

1 回答 1

1

注意:请注意,PDF 中的 Richmedia 是带有扩展名的 PDF 1.7,因此仅适用于 Adob​​e Reader 9+(不推荐使用 10,因为它在此功能中存在从未修复的错误)。

第一个答案是使用 RenderX,因为我为 RenderX 工作,这很容易。这是一个模板 XSL,可用于插入所谓的 RichMedia Annotation。

您可能在这样的文件中有一些 XML:

 <chart swf="SWF\Anychart.swf" flashvar="XMLData" width="300" height="300">
    <anychart>....</anychart> <!-- put the XML for the chart here -->
    <resources>
       <resource src="img\a.png"/>
    </resources>
  </chart>

您可以从这些中获取调用下面的模板。

这里的参数是:

chartxml:驱动图表的 XML 文件

宽度和高度:不言自明

flashvar:将 XML 传递给 SWF 的 FlashVar 命令。对于 Anychart,这是“XMLData”,对于 Fusioncharts,这是“dataXML”

@swf:在此模板中,这是实际 SWF 文件的路径(如“SWF'Anychart.swf”或“SWF\Bar2D.swf”

资源:图表或地图或其他所需的任何其他外部资源(如图像)

<xsl:template name="add-on.richmedia">
    <xsl:param name="chartxml"/>
    <xsl:param name="width"/>
    <xsl:param name="height"/>
    <xsl:param name="flashvar"/>
    <fo:block>
        <rx:rich-media-object scaling="non-uniform" name="test" width="{concat($width,'pt')}" height="{concat($height,'pt')}" content-width="scale-to-fit" content-height="scale-to-fit" transparency="true">
            <xsl:attribute name="src">
                <xsl:value-of select="@swf"/>
            </xsl:attribute>
                <rx:flash-var name="{$flashvar}" content="true">
                    <xsl:apply-templates select="$chartxml" mode="copy-of"/>
                </rx:flash-var>
            <xsl:for-each select="resources/resource">
                <rx:rich-media-resource>
                    <xsl:attribute name="src">
                        <xsl:text>url('</xsl:text>
                        <xsl:value-of select="@src"/>
                        <xsl:text>')</xsl:text>
                    </xsl:attribute>
                    <xsl:attribute name="name">
                        <xsl:value-of select="@src"/>
                    </xsl:attribute>
                </rx:rich-media-resource>
            </xsl:for-each>
        </rx:rich-media-object>
    </fo:block>
</xsl:template>

这将使用 rx:rich-media-object 在您的 FO 文档中插入一个块。RenderX 处理链接 PDF 内相关资产(图表 XML 和任何资源)的所有内部操作。结果是格式化为 PDF 时文档内的交互式 Flash 图表。还有其他方法可以做到这一点。您甚至可以插入闪存并使用“XMLfile”(用于 Anychart)或“dataurl”用于 FUsioncharts,并输入数据的 URL(如http://mychartserver.com/getdata)或其他任何内容并将动态数据提供给 PDF每次打开。

对于 iText,他们的网站上有完美的示例,而不是在这里发布更多。查看此链接,它显示了插入 SWF 和数据集所需的所有 Java 代码:

http://itextpdf.com/examples/iia.php?id=300

于 2013-06-22T17:46:57.023 回答