docx4j PDF 导出忽略 TextDirection
docx4j PDF export ignores TextDirection
我正在使用最新的 docx4j (3.3.7) 并生成 table,其中包含一个文本旋转 90 度的单元格。 docx
输出是正确的,但是当导出到 pdf
时,此单元格中的文本不会旋转,只是常规的从左到右的方向。
Plutext 的商业 PDF 转换器(默认启用)和 docx4j-export-fo
.
的行为相同
如何强制旋转 table 单元格中的文本?
我用来在 table 单元格中旋转文本的代码(在 docx
中工作正常,在 pdf
导出期间被忽略):
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
TextDirection td = new TextDirection();
td.setVal("tbRl");
tableCellProperties.setTextDirection(td);
我也试过这个,效果一样:
TextDirection td = new TextDirection();
td.setVal("tbRl");
paragraph.setPPr(new PPr());
paragraph.getPPr().setTextDirection(td);
我正在使用以下方法导出为 PDF:
Docx4J.toPDF(wordprocessingMLPackage, fileOutputStream);
由于 XSL FO 具有 属性 引用导向,应该可以在 docx4j-export-fo 中实现:
- https://www.oxygenxml.com/archives/xsl-list/201306/msg00050.html
- What does reference-orientation really do?
2018 年 6 月 17 日编辑
https://github.com/plutext/docx4j-export-FO/commit/3b2c7423c25fe73bb5a85d9aa8755cce6e1aca8e and https://github.com/plutext/docx4j/commit/d8254cbf69d7bb3decaa94254946bd293c5d3ec0实现这个。
然而,结果并不完美;使用 FOP 2.3 测试以下 XSL-FO:
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<layout-master-set
xmlns="http://www.w3.org/1999/XSL/Format"
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing">
<simple-page-master margin-bottom="12mm"
margin-left="1in" margin-right="1in" margin-top="12mm"
master-name="s1-simple" page-height="297mm" page-width="210mm">
<region-body column-count="1" column-gap="12mm"
margin-bottom="36.0pt" margin-left="0mm" margin-right="0mm"
margin-top="36.0pt" />
<region-before extent="0.0pt"
region-name="xsl-region-before-simple" />
<region-after extent="0.0pt"
region-name="xsl-region-after-simple" />
</simple-page-master>
<page-sequence-master master-name="s1">
<repeatable-page-master-alternatives>
<conditional-page-master-reference
master-reference="s1-simple" />
</repeatable-page-master-alternatives>
</page-sequence-master>
</layout-master-set>
<fo:page-sequence force-page-count="no-force"
id="section_s1" format="" master-reference="s1">
<fo:flow flow-name="xsl-region-body">
<fo:table border-bottom-color="#000000"
border-bottom-style="solid" border-bottom-width="0.5pt"
border-collapse="collapse" border-left-color="#000000"
border-left-style="solid" border-left-width="0.5pt"
border-right-color="#000000" border-right-style="solid"
border-right-width="0.5pt" border-top-color="#000000"
border-top-style="solid" border-top-width="0.5pt"
display-align="before" start-indent="1.12in" table-layout="fixed"
width="3.12in">
<fo:table-column column-number="1"
column-width="3.12in" />
<fo:table-body start-indent="0in">
<fo:table-row height="0.79in"
keep-together.within-page="always">
<fo:table-cell border-bottom-color="#000000"
border-bottom-style="solid" border-bottom-width="0.5pt"
border-left-color="#000000" border-left-style="solid"
border-left-width="0.5pt" border-right-color="#000000"
border-right-style="solid" border-right-width="0.5pt"
border-top-color="#000000" border-top-style="solid"
border-top-width="0.5pt" padding-bottom="0mm"
padding-left="1.91mm" padding-right="1.91mm" padding-top="0mm">
<fo:block-container reference-orientation="90">
<block xmlns="http://www.w3.org/1999/XSL/Format"
font-size="11.0pt" line-height="100%" space-after="0in"
start-indent="2mm">
<inline font-family="Calibri">Bottom up</inline>
</block>
</fo:block-container>
</fo:table-cell>
</fo:table-row>
<fo:table-row height="0.79in"
keep-together.within-page="always">
<fo:table-cell border-bottom-color="#000000"
border-bottom-style="solid" border-bottom-width="0.5pt"
border-left-color="#000000" border-left-style="solid"
border-left-width="0.5pt" border-right-color="#000000"
border-right-style="solid" border-right-width="0.5pt"
border-top-color="#000000" border-top-style="solid"
border-top-width="0.5pt" padding-bottom="0mm"
padding-left="1.91mm" padding-right="1.91mm" padding-top="0mm">
<fo:block-container
reference-orientation="-90">
<block xmlns="http://www.w3.org/1999/XSL/Format"
font-size="11.0pt" line-height="100%" space-after="0in"
start-indent="2mm">
<inline font-family="Calibri">Top down</inline>
</block>
</fo:block-container>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:block font-size="11.0pt" line-height="107%"
space-after="0.11in" white-space-treatment="preserve">
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
文本按预期旋转,但在一种情况下出现在单元格之外。
另见 Rotated text in table cell rendered above cell not within
如果您进一步探索这个问题,您可能会得出一些额外的 fo 属性是必需的结论,或者它是 FOP 中的一个错误。请在此处的评论中分享您的发现。
顺便说一句,XHTML 输出中有类似的行为。
我正在使用最新的 docx4j (3.3.7) 并生成 table,其中包含一个文本旋转 90 度的单元格。 docx
输出是正确的,但是当导出到 pdf
时,此单元格中的文本不会旋转,只是常规的从左到右的方向。
Plutext 的商业 PDF 转换器(默认启用)和 docx4j-export-fo
.
如何强制旋转 table 单元格中的文本?
我用来在 table 单元格中旋转文本的代码(在 docx
中工作正常,在 pdf
导出期间被忽略):
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
TextDirection td = new TextDirection();
td.setVal("tbRl");
tableCellProperties.setTextDirection(td);
我也试过这个,效果一样:
TextDirection td = new TextDirection();
td.setVal("tbRl");
paragraph.setPPr(new PPr());
paragraph.getPPr().setTextDirection(td);
我正在使用以下方法导出为 PDF:
Docx4J.toPDF(wordprocessingMLPackage, fileOutputStream);
由于 XSL FO 具有 属性 引用导向,应该可以在 docx4j-export-fo 中实现:
- https://www.oxygenxml.com/archives/xsl-list/201306/msg00050.html
- What does reference-orientation really do?
2018 年 6 月 17 日编辑
https://github.com/plutext/docx4j-export-FO/commit/3b2c7423c25fe73bb5a85d9aa8755cce6e1aca8e and https://github.com/plutext/docx4j/commit/d8254cbf69d7bb3decaa94254946bd293c5d3ec0实现这个。
然而,结果并不完美;使用 FOP 2.3 测试以下 XSL-FO:
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<layout-master-set
xmlns="http://www.w3.org/1999/XSL/Format"
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing">
<simple-page-master margin-bottom="12mm"
margin-left="1in" margin-right="1in" margin-top="12mm"
master-name="s1-simple" page-height="297mm" page-width="210mm">
<region-body column-count="1" column-gap="12mm"
margin-bottom="36.0pt" margin-left="0mm" margin-right="0mm"
margin-top="36.0pt" />
<region-before extent="0.0pt"
region-name="xsl-region-before-simple" />
<region-after extent="0.0pt"
region-name="xsl-region-after-simple" />
</simple-page-master>
<page-sequence-master master-name="s1">
<repeatable-page-master-alternatives>
<conditional-page-master-reference
master-reference="s1-simple" />
</repeatable-page-master-alternatives>
</page-sequence-master>
</layout-master-set>
<fo:page-sequence force-page-count="no-force"
id="section_s1" format="" master-reference="s1">
<fo:flow flow-name="xsl-region-body">
<fo:table border-bottom-color="#000000"
border-bottom-style="solid" border-bottom-width="0.5pt"
border-collapse="collapse" border-left-color="#000000"
border-left-style="solid" border-left-width="0.5pt"
border-right-color="#000000" border-right-style="solid"
border-right-width="0.5pt" border-top-color="#000000"
border-top-style="solid" border-top-width="0.5pt"
display-align="before" start-indent="1.12in" table-layout="fixed"
width="3.12in">
<fo:table-column column-number="1"
column-width="3.12in" />
<fo:table-body start-indent="0in">
<fo:table-row height="0.79in"
keep-together.within-page="always">
<fo:table-cell border-bottom-color="#000000"
border-bottom-style="solid" border-bottom-width="0.5pt"
border-left-color="#000000" border-left-style="solid"
border-left-width="0.5pt" border-right-color="#000000"
border-right-style="solid" border-right-width="0.5pt"
border-top-color="#000000" border-top-style="solid"
border-top-width="0.5pt" padding-bottom="0mm"
padding-left="1.91mm" padding-right="1.91mm" padding-top="0mm">
<fo:block-container reference-orientation="90">
<block xmlns="http://www.w3.org/1999/XSL/Format"
font-size="11.0pt" line-height="100%" space-after="0in"
start-indent="2mm">
<inline font-family="Calibri">Bottom up</inline>
</block>
</fo:block-container>
</fo:table-cell>
</fo:table-row>
<fo:table-row height="0.79in"
keep-together.within-page="always">
<fo:table-cell border-bottom-color="#000000"
border-bottom-style="solid" border-bottom-width="0.5pt"
border-left-color="#000000" border-left-style="solid"
border-left-width="0.5pt" border-right-color="#000000"
border-right-style="solid" border-right-width="0.5pt"
border-top-color="#000000" border-top-style="solid"
border-top-width="0.5pt" padding-bottom="0mm"
padding-left="1.91mm" padding-right="1.91mm" padding-top="0mm">
<fo:block-container
reference-orientation="-90">
<block xmlns="http://www.w3.org/1999/XSL/Format"
font-size="11.0pt" line-height="100%" space-after="0in"
start-indent="2mm">
<inline font-family="Calibri">Top down</inline>
</block>
</fo:block-container>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:block font-size="11.0pt" line-height="107%"
space-after="0.11in" white-space-treatment="preserve">
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
文本按预期旋转,但在一种情况下出现在单元格之外。
另见 Rotated text in table cell rendered above cell not within
如果您进一步探索这个问题,您可能会得出一些额外的 fo 属性是必需的结论,或者它是 FOP 中的一个错误。请在此处的评论中分享您的发现。
顺便说一句,XHTML 输出中有类似的行为。