一、免费方式
优点:1、免费;2、在众多免费中挑选出的转换效果相对较好,并且不用像openOffice那样安装服务
缺点:1、对字体支持没有很好,需要安装字体库或者使用宋体(对宋体支持很好)2、对于使用freeMarker模板转化过来的doc无法读取转换
第一步:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>
<version>2.0.1</version>
</dependency>
第二步:
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("D:\\test\\研判报告docx.docx");
XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream);
// 将word中字体转化为宋体,防止其他字体无法正常显示
setFontType(xwpfDocument);
FileOutputStream fileOutputStream = new FileOutputStream("D:\\test\\研判报告11.docx");
PdfConverter.getInstance().convert(xwpfDocument,fileOutputStream,pdfOptions);
fileInputStream.close();
fileOutputStream.close();
}
/***
* 将文档的文字设置为宋体 防止其他字体转pdf不显示
* @Description:
* @param xwpfDocument
* @return:
*/
private static void setFontType(XWPFDocument xwpfDocument) {
//转换文档中文字字体
List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
if(paragraphs != null && paragraphs.size()>0){
for (XWPFParagraph paragraph : paragraphs) {
List<XWPFRun> runs = paragraph.getRuns();
if(runs !=null && runs.size()>0){
for (XWPFRun run : runs) {
run.setFontFamily("宋体");
}
}
}
}
//转换表格里的字体 我也不想俄罗斯套娃但是不套真不能设置字体
List<XWPFTable> tables = xwpfDocument.getTables();
for (XWPFTable table : tables) {
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
List<XWPFTableCell> tableCells = row.getTableCells();
for (XWPFTableCell tableCell : tableCells) {
List<XWPFParagraph> paragraphs1 = tableCell.getParagraphs();
for (XWPFParagraph xwpfParagraph : paragraphs1) {
List<XWPFRun> runs = xwpfParagraph.getRuns();
for (XWPFRun run : runs) {
run.setFontFamily("宋体");
}
}
}
}
}
}
二、收费方式:
除了收费没啥缺点
1、freemarker生成word模板
①、自己新建一个word文档,内容就按照需要的格式内容
②、word文档另存为,选择xml格式
③、修改xml后缀为ftl放在如图位置
④代码:
public static void main(String[] args) throws Exception {
//1.创建配置类
Configuration configuration=new Configuration(Configuration.getVersion());
//2.设置模板所在的目录
configuration.setDirectoryForTemplateLoading(new File(".\\template"));
//3.设置字符集
configuration.setDefaultEncoding("utf-8");
//4.加载模板
Template template = configuration.getTemplate("研判报告docx.ftl");
//5.创建数据模型
Map map=new HashMap();
map.put("name","姓名姓名");
map.put("idCard","身份证号码");
map.put("age","36");
map.put("sex","男");
Map<String, Object> data1 = new HashMap<>();
data1.put("item",map);
Writer out =new FileWriter(new File(".\\template\\研判报告docx.docx"));
//7.输出
template.process(data1, out);
//8.关闭Writer对象
out.close();
}
2、word转pdf
①、新建asposeLicense.xml放到如图位置
asposeLicense.xml内容:
<License>
<Data>
<Products>
<Product>Aspose.Total for Java</Product>
<Product>Aspose.Words for Java</Product>
</Products>
<EditionType>Enterprise</EditionType>
<SubscriptionExpiry>20991231</SubscriptionExpiry>
<LicenseExpiry>20991231</LicenseExpiry>
<SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
</Data>
<Signature>
sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=
</Signature>
</License>
②、代码
public static void main(String[] args) {
String docPath = ".\\template\\研判报告docx.docx";
String savePath = ".\\template\\研判报告docx4.pdf";
word2pdf(docPath, savePath);
}
public static void word2pdf(String docPath, String savePath) {
try {
ClassPathResource resource = new ClassPathResource("asposeLicense.xml");
InputStream inputStream = resource.getInputStream();
License license = new License();
license.setLicense(inputStream);
com.aspose.words.Document document = new com.aspose.words.Document(docPath);
document.save(new FileOutputStream(new File(savePath)), SaveFormat.PDF);
} catch (Exception e) {
e.printStackTrace();
}
}