2

我正在做一个项目,其中我们有图表和导出为 PDF 的表格。我们使用 Apache FOP 生成 PDF。图表采用 SVG 格式,如果只有一个,则可以正常显示。但是,我们会遇到最多四个的情况,在这些情况下,四个中只有三个适合生成的 PDF。无论数量如何,我都需要所有图像都适合。恐怕当我们需要更多内容时,简单地将页面放在横向将是一个临时解决方案。每个图表的大小都是从 Highcharts 库在客户端生成的 svg 中以像素为单位设置的。即使我按照此处看到的示例为 instream-foreign-object 设置了属性,图像似乎也没有任何缩放就被插入到 pdf 中:Scaling images using scale-to-fit

所以我需要每个图表“缩小以适应”。我尝试设置包含每个包含 instream-foreign 对象的元素的元素的长度和宽度(我也包括我的 xsl)。在 instream-foreign 对象中,我将 svg 宽度和高度分配给实际图表 svg 中的值。我想也许这就是问题所在,但如果我不包括这些维度,图表就不会出现在 pdf 中。我还尝试根据此处的问题将缩放属性设置为“非均匀”:缩放具有固定高度的图像,结果并没有更好。它实际上在整个页面上拉伸了一个图表,因此只显示了四个中的一个。这是我的xsl:

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <fo:root>
    <fo:layout-master-set>
        <fo:simple-page-master master-name="exportPage">
            <fo:region-body />
            </fo:simple-page-master>
        </fo:layout-master-set>
        <fo:page-sequence master-reference="exportPage">
        <fo:flow flow-name="xsl-region-body">
            <fo:block id="mainTitleBlock" font-family="arial, helvetica, sans-serif" color="#5c068c" font-weight="bold">
                <xsl:value-of  select="exports/export/charts/@mainTitle"/>
            </fo:block>
            <fo:block id="timestampBlock" font-family="arial, helvetica, sans-serif" font-size="small" color="#6D869F">
                <xsl:value-of  select="exports/export/charts/@timeStamp"/>
            </fo:block>
            <!-- This is where the charts go -->
            <!-- Within this block will be an inline element for each chart--> 
        <fo:block id="chartBlock" width="8.25in" height="6in">

          <xsl:apply-templates select="exports/export/charts/chart"/>

        </fo:block>
                <fo:block id="tableBlock" >
                    <xsl:apply-templates select="exports/export/table"/>
                </fo:block>
            </fo:flow>
            </fo:page-sequence>
         </fo:root>
</xsl:template>
   <!-- Creates the table -->
<xsl:template match="table">
<fo:table table-layout="fixed" width="100%" >
    <fo:table-header>
    <fo:table-row>
    <xsl:apply-templates select="tblRow[position() = 1]"/>
    </fo:table-row>
    </fo:table-header>
    <fo:table-body>
    <xsl:apply-templates select="tblRow[position() > 1]"/>
    </fo:table-body>
</fo:table>
</xsl:template>

<xsl:template match="hdrCell">
    <fo:table-cell background-color="#666" border-right-style="solid" border-right-width="1px" border-right-color="white" empty-cells="show">
    <fo:block color="white" font-family="arial, helvetica, sans-serif" font-size="x-small"><xsl:value-of select="."/></fo:block>
    </fo:table-cell>
</xsl:template>

<xsl:template match="tblCell">
    <fo:table-cell border-bottom-style="solid" border-bottom-width="1px" border-bottom-color="#E3E3E3" >
    <fo:block color="#7E7E7E" font-family="arial, helvetica, sans-serif" font-size="x-small"><xsl:value-of select="."/></fo:block>
    </fo:table-cell>
</xsl:template >

<xsl:template match="tblRow[position() > 1]">
    <fo:table-row>
    <xsl:apply-templates />
    </fo:table-row>
</xsl:template>

<xsl:template match="chart">
<fo:inline>
    <fo:instream-foreign-object xmlns:svg="http://www.w3.org/2000/svg" content-width="scale-to-fit" content-height="100%" width="100%" scaling="uniform">
    <svg:svg width="{svg:svg/@width}" height="{svg:svg/@height}">
    <xsl:copy-of select="svg:svg"/>
    </svg:svg>
    </fo:instream-foreign-object>
</fo:inline>
</xsl:template>

 </xsl:stylesheet>

我错过了什么?在表格单元格中显示图表是否有帮助(从而打破了不使用表格进行布局的惯例——太可怕了!)?我怎样才能让这些缩放并适合页面?

谢谢,布兰特

4

1 回答 1

2

scale 属性使图表适合包含块。如果您没有为该块设置尺寸,格式化引擎将不知道要缩放到什么尺寸,因此它将使用 100%。我不知道当您将多个图表放在一个块中时会发生什么。

您可能需要将图表放在一个表格中,每列一个图表,以便您可以根据图表的数量设置列宽。

于 2013-10-17T08:01:11.683 回答