我正在尝试在 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 无法准确反映表格和合并单元格的格式。
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
看起来像这样: