功能描述:
想生成一个PDF格式的制式文件
1.准备一个WORD模板,替换模板中的参数,生成目标文档(docx);
2.将目标文档(docx)转换成PDF。
遇到了一个这样的问题
根据模板生成的Word文件,和想象中一模一样,无比正常。在生成PDF时,就会报错:
XWPFConverterException、NumberFormatException: For input string: “”
fr.opensagres.poi.xwpf.converter.core.XWPFConverterException: java.lang.NumberFormatException: For input string: ""
at fr.opensagres.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:71)
at fr.opensagres.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:39)
at fr.opensagres.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:46)
PDF文件会创建,打开时也报错:
报错代码位置:
PdfConverter.getInstance().convert(xwpfDocument,fileOutputStream,pdfOptions);
源码:
public static String createFile(Map<String, Object> map, String fileName) {
String modelFileName = "//D://model//模板.docx";
String outputDocxName = "//D://model//output//文档.docx";
String pdfFileName = "//D://model//output//文档.pdf";
try {
XWPFTemplate template = XWPFTemplate.compile(new FileInputStream( modelFileName )).render(map);
CTProperties properties = template.getXWPFDocument().getProperties().getExtendedProperties().getUnderlyingProperties();
int a = properties.getPages();
FileOutputStream out = new FileOutputStream(outputDocxName);
template.write(out);
out.flush();
out.close();
InputStream fileInputStream = new FileInputStream( outputDocxName );
XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream);
xwpfDocument.createNumbering();
PdfOptions pdfOptions = PdfOptions.create();
OutputStream fileOutputStream = new FileOutputStream(pdfFileName);
PdfConverter.getInstance().convert(xwpfDocument,fileOutputStream,pdfOptions);
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
pdfFileName = "";
e.printStackTrace();
}
return pdfFileName;
}
参考了一些 ,并未解决,比如:
poi xwpf 转换成 html,生成的doc文档转换html失败
生成的doc文档转换pdf失败 · Issue #95
于是,开始在包里打断点跟代码…
发现把模板生成的Word,加个空格再去掉,点击保存,就能成功生成PDF。
十分诡异,不过基本锁定是生成的Word有问题,导致生成PDF失败,虽然肉眼看不出Word有什么问题。
想到这个工程是比较老的,配置可能也比较老,先改到最新试试。com.deepoove.poi-tl升到1.9.0之后,提示poi至少要4.1.2版本。
原来的配置:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId>
<version>2.0.1</version>
</dependency>
更新版本:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>
<version>2.0.2</version>
</dependency>
虽然不知道原理是什么,不过这次好用了。