XSL-FO 到 PDF 的转换产生意外结果
XSL-FO to PDF translation produces unexpected result
这是我要转换为 PDF 的 XSL-FO。当我使用 Apache FOP 时,在第一个 table 中,第二行元素叠加在第一行的第二个单元格上。这是意外行为,因为第二个 table 呈现得很好。
您可以使用 this online renderer 查看生成的输出。
在第三个框中粘贴XML代码并转换为pdf。
我的 xsl-fo 有问题吗?据我所知,table 在功能上是相同的
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="letter" page-height="11in" page-width="8.5in" margin-top="0.5in"
margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in">
<fo:region-body region-name="xsl-region-body" column-count="2"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="letter">
<fo:flow flow-name="xsl-region-body">
<fo:block span="all" font-size="16pt" font-weight="bold" margin-top="9pt">
<fo:inline text-decoration="underline">Sales Info</fo:inline>
</fo:block>
<fo:table table-layout="fixed" font-size="12pt">
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Name </fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: 12314</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Office Phone</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: -</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Email1</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: -</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Email 2</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: -</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:block span="all" font-size="16pt" font-weight="bold" margin-top="9pt">
<fo:inline text-decoration="underline">Order</fo:inline>
</fo:block>
<fo:table table-layout="fixed" font-size="12pt">
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Number</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: asdasd</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Type</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: A</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Region</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: 12341</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Location</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: 12341</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
我用 AH Formatter 得到了相同的结果,当我第一次看到它时,我和你一样困惑。
你的 fo:region-body
有 column-count="2"
。由于以下 <fo:block span="all" ...>
.
,您看到第一个 table 跨越两列
第二个 table 不会中断,因为格式化程序通常会先填充一列,然后再将内容放入第二列。带有 span="all"
的块使格式化程序希望在放置块之前平衡列。如果您在第二个 table 之后放置另一个这些块,第二个 table 将表现类似。
您的 table 对于单列来说太宽了。第二个 table 看起来可行,但实际上每一行都超出了第二列的宽度。
span
仅适用于 fo:block
和 fo:block-container
,因此不适用于 fo:table
。解决方案是将 fo:table
放在具有 span="all"
的 fo:block
或 fo:block-container
中,以便您的 table 占据页面的整个宽度并执行不跨列。
或者,如果没有任何内容需要格式化为两列,那么您可以删除 column-count="2"
和所有 span="all"
.
这是我要转换为 PDF 的 XSL-FO。当我使用 Apache FOP 时,在第一个 table 中,第二行元素叠加在第一行的第二个单元格上。这是意外行为,因为第二个 table 呈现得很好。
您可以使用 this online renderer 查看生成的输出。 在第三个框中粘贴XML代码并转换为pdf。 我的 xsl-fo 有问题吗?据我所知,table 在功能上是相同的
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="letter" page-height="11in" page-width="8.5in" margin-top="0.5in"
margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in">
<fo:region-body region-name="xsl-region-body" column-count="2"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="letter">
<fo:flow flow-name="xsl-region-body">
<fo:block span="all" font-size="16pt" font-weight="bold" margin-top="9pt">
<fo:inline text-decoration="underline">Sales Info</fo:inline>
</fo:block>
<fo:table table-layout="fixed" font-size="12pt">
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Name </fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: 12314</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Office Phone</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: -</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Email1</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: -</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Email 2</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: -</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:block span="all" font-size="16pt" font-weight="bold" margin-top="9pt">
<fo:inline text-decoration="underline">Order</fo:inline>
</fo:block>
<fo:table table-layout="fixed" font-size="12pt">
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-column column-width="2.25in"/>
<fo:table-column column-width="1.5in"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Number</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: asdasd</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Type</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: A</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="12pt">Region</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: 12341</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">Location</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-size="12pt">: 12341</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
我用 AH Formatter 得到了相同的结果,当我第一次看到它时,我和你一样困惑。
你的 fo:region-body
有 column-count="2"
。由于以下 <fo:block span="all" ...>
.
第二个 table 不会中断,因为格式化程序通常会先填充一列,然后再将内容放入第二列。带有 span="all"
的块使格式化程序希望在放置块之前平衡列。如果您在第二个 table 之后放置另一个这些块,第二个 table 将表现类似。
您的 table 对于单列来说太宽了。第二个 table 看起来可行,但实际上每一行都超出了第二列的宽度。
span
仅适用于 fo:block
和 fo:block-container
,因此不适用于 fo:table
。解决方案是将 fo:table
放在具有 span="all"
的 fo:block
或 fo:block-container
中,以便您的 table 占据页面的整个宽度并执行不跨列。
或者,如果没有任何内容需要格式化为两列,那么您可以删除 column-count="2"
和所有 span="all"
.