为什么会出现个二,是因为使用spire.doc免费版它有个弊端,免费版只能转前三页的内容多了不行。所以说啊,还得靠自己少用其他第三方的组件,开源的还好。盈利的怎么可能让人白嫖。哎所以自己又搞了个poi的转换。踩了一些坑。
首先是依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.0</version>
</dependency>
然后转换代码
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
public static void main(String[] args) {
FileInputStream fis = new FileInputStream("这是一个输入地址.docx");
FileOutputStream fos = new FileOutputStream("这是一个输出地址.pdf");
XWPFDocument xwpfDocument = new XWPFDocument(fis);
setFontType(xwpfDocument);
PdfOptions pdfOptions = PdfOptions.create();
PdfConverter.getInstance().convert(xwpfDocument,fos,pdfOptions);
}
/***
* 将文档的文字设置为宋体 防止其他字体转pdf不显示
* @Description:
* @param xwpfDocument
* @return:
*/
private 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("宋体");
}
}
}
}
}
}
踩坑
通过PdfConverter.getInstance().convert(xwpfDocument,fos,pdfOptions)方式;转pdf存在一个问题,就是当docx文档中的汉字,字体不是宋体时,转换出来的pdf文件是不显示这个汉字的。
想到的方法是将获取的xwpfDocument文档,在内存中设置他的字体将字体改为宋体,然后在调用转换方法。就是我的setFontType方法,因为我的doc文档中有表格所以将表格中的内容也设置成了宋体。这样转出的pdf就不会有中文不显示的问题了。