注意:请注意,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,这是“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