我们有一个预定义的文档 docx 文件。我们正在使用 Apache POI java 程序将 docx 转换为 PDF。 Java 程序仅用于将 docx 转换为 PDF - 没有其他用途。
简化的Java代码:
InputStream instrm = new ByteArrayInputStream(decodedBytes);
ByteArrayOutputStream outstrm = new ByteArrayOutputStream();
XWPFDocument document = new XWPFDocument(instrm);
PdfOptions options = PdfOptions.create();
PdfConverter.getInstance().convert(instrm, outstrm, options);
//outstrm is the one that is n output from the java component
效果很好,包括具有小图像(公司徽标)和预定义表格的文档。
我们需要以编程方式向文档添加另一个表。另一个小组使用 C# DocumentFormat.OpenXml 包添加了这个新表。
简化的 C# 代码(再次作为 Azure Function App 运行):
using DocumentFormat.OpenXml.Wordprocessing;
var outputStream = new MemoryStream(Convert.FromBase64String(prependBase64String));
Table table = new Table();
var tr = new TableRow();
TableCell tc = new TableCell(new Paragraph(new Run(new Text("SimpleText"))));
tr.Append(tc);
table.Append(tr);
当 C# 程序运行时,它创建的文档绝对没问题。当我使用 MS Word UI 打开 docx 文件时,我可以看到创建了一个单元格的表格。
问题: 但是,现在将这个带有动态创建的新表的新 docx 文件输入到我的 Java 程序中会引发异常:“CTTblGrid.getGridColList grid is null”完整异常读取:fr.opensagres.poi.xwpf.converter.core.XWPFConverterException:java.lang .NullPointerException:无法调用“org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid.getGridColList()”,因为“grid”为空
此处要注意 - 如果我打开此 Word 文档,并在不更改任何内容的情况下发出“另存为”,并将此文件文档输入到我的 Java 组件中,Java 会将此文档(包括动态表)转换为 PDF 格式。
Word 在“保存”操作期间正在执行一些操作,以“修复”以编程方式生成的表中的某些内容。
对于 Microsoft Word 打开文档来说,使用 Table 似乎足够了,但如果您想使用 Apache POI 将包含表格的文档另存为 PDF,则还不够。您必须将 TableGrid Openxml 对象添加到 Table 对象。