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