使用 fr.opensagres.poi.xwpf.converter.pdf (Apache POI) 将 DOCX 转换为 PDF 时出现表格格式问题

问题描述 投票:0回答:1

我正在尝试在 DOCX 文件中创建一个表,然后使用 Apache POI(版本 5.2.3)和 XWPF Converter(版本 2.0.4)库将其转换为 PDF。我已成功创建表格并合并 DOCX 文件中的单元格。但是,当我使用 XWPF 转换器将 DOCX 文件转换为 PDF 时,生成的 PDF 没有正确的格式。

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfOptions options = PdfOptions.create();
PdfConverter.getInstance().convert(document, byteArrayOutputStream, options);
byte[] pdfBytes = byteArrayOutputStream.toByteArray();

预期结果: 我希望转换后的 PDF 能够保持原始 DOCX 文件中显示的表格格式和单元格合并。

实际结果: 转换后的 PDF 无法准确反映表格和合并单元格的格式。

java apache-poi xdocreport
1个回答
2
投票

XDocReport 的程序员在处理 Office Open XML 格式的 Microsoft Word

*.docx
文档的真正复杂的文件结构方面做得非常出色。但是,当然,总是有没有解决的问题。

当涉及到Word中的表格时,我知道以下问题:

Word 表格的行高可能未明确设置,因此仅由内容决定。那么 XDocReport 不会考虑字体下伸部分来计算高度。

Word 表格可能使用

gridBefore
wBefore
(对于行中第一个单元格之前的单元格)和/或
gridAfter
wAfter
(对于行中最后一个单元格之后的单元格)隐藏表格单元格。这样的单元格不是行的一部分,也不是通过单元格合并设置的。这是 XDocReport 没有考虑到的。并且由于丢失了单元格,整个表格结构被损坏。

Word表格可能通过表格样式设置了交替的行背景。这是 XDocReport 没有考虑到的。

可能还有更多。但我怀疑是否有任何免费软件能够真正考虑 Microsoft Word 文档的所有复杂可能性。即使是商业软件,除了 Microsoft Word 本身,也会出现问题。

以下简短的完整Java程序可用于测试:

import java.io.*;
import java.math.BigInteger;

//needed jars: fr.opensagres.poi.xwpf.converter.core-2.0.4.jar, 
//             fr.opensagres.poi.xwpf.converter.pdf-2.0.4.jar,
//             fr.opensagres.xdocreport.itext.extension-2.0.4.jar,
//             itext-4.2.1.jar                                   
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;

//needed jars: apache poi 5.2.3 and it's dependencies
//             and additionally: poi-ooxml-full-5.2.3.jar 
import org.apache.poi.xwpf.usermodel.*;

public class XWPFToPDFConverterSampleMin {

 public static void main(String[] args) throws Exception {

  String docPath = "./XWPFDocument.docx";
  String outputFile = "./XWPFDocument.pdf";

  InputStream in = new FileInputStream(new File(docPath));
  XWPFDocument document = new XWPFDocument(in);

  PdfOptions options = PdfOptions.create();
  OutputStream out = new FileOutputStream(outputFile);
  PdfConverter.getInstance().convert(document, out, options);

  document.close();
  out.close(); 

 }
}

XWPFDocument.docx
看起来像这样:

结果

XWPFDocument.pdf
看起来像这样:

© www.soinside.com 2019 - 2024. All rights reserved.