使用Apache POI转换时如何更改边距

时间:2018-09-23 13:05:18

标签: java pdf apache-poi docx

从Microsoft Word文档转换时,我需要更改 PDF 文件的边距。

<style>
  .card-body .text::after {
    font-size: 200%;
    float: right;
  }
  .card-body.optimal .text::after {
    content: "O"; /* replacing these with the glyphs you want */
  }
  .card-body.lower .text::after {
    content: "L";
  }
  .card-body.higher .text::after {
    content: "H";
  }
</style>

<div class="card-body optimal" ng-repeat="item in resTemperature" ng-if="$last">
  <p>Temperature &emsp;
    <span class="text" style="font-weight: bold; font-size:150%"  ng-repeat="i in item">{{i}} °C </span>
  </p>
</div>

这不起作用。边距在pdf中不变


但是当我这样做时:

public class TestCon {
    public static final String DEST = "./test.pdf";
    public static final String SRC = "./test.docx";

    public static void main(String[] args) {
        try {
            InputStream doc = new FileInputStream(new File(SRC));

            XWPFDocument document = new XWPFDocument(doc );
            CTSectPr addNewSectPr = document.getDocument().getBody().addNewSectPr();
            CTPageMar addNewPgMar = addNewSectPr.addNewPgMar();
            addNewPgMar.setLeft(BigInteger.valueOf(720L));
            addNewPgMar.setTop(BigInteger.valueOf(720L));
            addNewPgMar.setRight(BigInteger.valueOf(720L));
            addNewPgMar.setBottom(BigInteger.valueOf(720L));

            OutputStream out = new FileOutputStream(new File(DEST));
            PdfOptions options = PdfOptions.create();
            PdfConverter.getInstance().convert(document, out, options);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

无需转换为PDF,即可使用。

1 个答案:

答案 0 :(得分:2)

解决方案:

调整与sectPrpgMar相关的代码部分,以不添加新部分,而是重新使用它们:

CTSectPr getSectPr = document.getDocument().getBody().getSectPr();
getSectPr.unsetPgMar();
CTPageMar addNewPgMar = getSectPr.addNewPgMar();
addNewPgMar.setLeft(BigInteger.valueOf(720L));
addNewPgMar.setTop(BigInteger.valueOf(720L));
addNewPgMar.setRight(BigInteger.valueOf(720L));
addNewPgMar.setBottom(BigInteger.valueOf(720L));
// Also good to handle footer and header for more expectable result
addNewPgMar.setFooter(BigInteger.valueOf(0L));
addNewPgMar.setHeader(BigInteger.valueOf(0L));

说明:

此问题的原因是 XDocReport 转换器(与 Apache POI 分开的项目)仅处理文档的第一个sectPr项。< / p>

您的样本将在下面生成WordprocessingML >>

<w:sectPr w:rsidR="003F19CD" w:rsidRPr="005E1322">
  <w:pgSz w:h="16838" w:w="11906"/>
  <w:pgMar w:bottom="1134" w:footer="708" w:header="708" w:left="1701" w:right="850" w:top="1134"/>
  <w:cols w:space="708"/>
  <w:docGrid w:linePitch="360"/>
</w:sectPr>
<w:sectPr>
  <w:pgMar w:bottom="620" w:left="620" w:right="620" w:top="620"/>
</w:sectPr>

在转换为PDF的过程中,将以忽略第二pgmar<w:pgMar w:bottom="620" w:left="620" w:right="620" w:top="620"/>)的方式处理,因为它是第二sectPr的一部分。

将调整后的文档保存到新的 Word 文档pgMar中的相同时间,您将看到所需的结果(调整后的边距),新的 WordprocessingML 看起来会这样:

<w:sectPr w:rsidR="003F19CD" w:rsidRPr="005E1322">
  <w:pgSz w:h="16838" w:w="11906"/>
  <w:pgMar w:left="620" w:top="620" w:right="620" w:bottom="620" w:footer="0" w:header="0"/>
  <w:cols w:space="708"/>
  <w:docGrid w:linePitch="360"/>
</w:sectPr>
<w:sectPr>
  <w:pgMar w:bottom="620" w:left="620" w:right="620" w:top="620"/>
</w:sectPr>

解决方案部分中的代码示例将生成单个sectPr和单个pgMar,因此PDFConverter将根据需要工作。


其他信息:

还需要提及的是 XDocReport 提供了configuration possibility >>

options.setConfiguration(new IPdfWriterConfiguration() {
    public void configure(PdfWriter writer) {
        writer.setPDFXConformance(PdfWriter.PDFA1A);
    }
});

但是不幸的是,无法以这种方式处理页边空白(docx文档中的页边空白值在完成配置后也会覆盖它们)。


下面另外是使用的pom.xml依赖项:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>

<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId>
    <version>2.0.1</version>
</dependency>