【问题标题】:docx4j PDF export ignores TextDirectiondocx4j PDF 导出忽略 TextDirection
【发布时间】:2018-06-14 08:18:24
【问题描述】:

我正在使用最新的 docx4j (3.3.7) 并生成表格,其中包含一个带有旋转 90 度文本的单元格。 docx 输出是正确的,但是当导出到 pdf 时,此单元格中的文本不会旋转,只是常规的从左到右的方向。

Plutext 的商业 PDF 转换器(默认启用)和docx4j-export-fo 的行为相同。

如何强制表格单元格中的文本旋转?

我用于在 tableCell 中旋转文本的代码(在 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);

【问题讨论】:

    标签: pdf pdf-generation docx4j export-to-pdf


    【解决方案1】:

    由于XSL FO有reference-orientation属性,应该可以在docx4j-export-fo中实现:

    2018 年 6 月 17 日编辑

    https://github.com/plutext/docx4j-export-FO/commit/3b2c7423c25fe73bb5a85d9aa8755cce6e1aca8ehttps://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实现,或者这个功能没有实现?
    • 未在 3.3.7 中实现,我的回答旨在为您提供足够的信息来“抓痒”。现已实施,但根据上述修改,可能需要调整。
    • 哇,谢谢 - 没想到!刚刚在我的项目中使用了 github 版本并且 TextDirection 有效。我遇到了你提到的错误,我会尝试自己修复它。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2016-02-20
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多