word文档转pdf实现(二)

6,028 阅读2分钟

为什么会出现个二,是因为使用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就不会有中文不显示的问题了。