PDF格式的动态图表或图形

时间:2013-06-22 13:22:47

标签: xml pdf flash interactive

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

谢谢,

Wap Rau

1 个答案:

答案 0 :(得分:1)

一个注意事项:请注意PDF格式的Richmedia是带扩展名的PDF 1.7,因此仅适用于Adobe 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,这是Fusioncharts的“XMLData”,这是“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图表。还有其他方法可以做到这一点。您甚至可以插入闪存并使用“XML文件”(对于Anychart)或“dataurl”用于FUsioncharts并输入数据的URL(如http://mychartserver.com/getdata)或其他任何内容,并在每次向PDF提供动态数据时打开。

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

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