将Word文档转成PDF文件,直接放代码:
package com.test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFPicture;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
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;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
public class Test {
public static void main(String[] args) throws IOException {
InputStream src =new FileInputStream("E:/222.docx");
byte[] s=docxToPdf(src);
// 创建FileOutputStream对象
FileOutputStream fos = new FileOutputStream("e:/test-222.pdf", false);
// 将byte数据写入文件
fos.write(s);
// 关闭文件
fos.close();
}
public static byte[] docxToPdf(InputStream src) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] resBytes = null;
String result;
try {
// pdf文件的尺寸
Document pdfDocument = new Document(PageSize.A3, 72, 72, 72, 72);
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, baos);
XWPFDocument doc = new XWPFDocument(src);
pdfWriter.setInitialLeading(20);
java.util.List<XWPFParagraph> plist = doc.getParagraphs();
pdfWriter.open();
pdfDocument.open();
/*
List<XWPFTable> tables = doc.getTables();
//System.out.println("===tables=="+tables);
for (int i = 0; i < tables.size(); i++) {
System.out.println("==="+tables.get(i));
XWPFTable table = tables.get(i);
//读取每一行数据
for (int j = 0; j < table.getNumberOfRows(); j++) {
System.out.println("==="+table.getRow(j));
}
}
*/
for (int i = 0; i < plist.size(); i++) {
XWPFParagraph pa = plist.get(i);
java.util.List<XWPFRun> runs = pa.getRuns();
for (int j = 0; j < runs.size(); j++) {
XWPFRun run = runs.get(j);
java.util.List<XWPFPicture> piclist = run.getEmbeddedPictures();
Iterator<XWPFPicture> iterator = piclist.iterator();
while (iterator.hasNext()) {
XWPFPicture pic = iterator.next();
XWPFPictureData picdata = pic.getPictureData();
byte[] bytepic = picdata.getData();
Image imag = Image.getInstance(bytepic);
imag.scalePercent(80);//缩放百分比
pdfDocument.add(imag);
}
// 中文字体的解决,否则没有中文
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//Font font = new Font(bf, 11.0f, Font.NORMAL, BaseColor.BLACK);
Font font = new Font(bf);
String text = run.getText(-1);
byte[] bs;
if (text != null) {
bs = text.getBytes();
String str = new String(bs);
Chunk chObj1 = new Chunk(str, font);
pdfDocument.add(chObj1);
}
}
pdfDocument.add(new Chunk(Chunk.NEWLINE));
}
//需要关闭,不然无法获取到输出流
pdfDocument.close();
pdfWriter.close();
resBytes = baos.toByteArray();
} catch (Exception e) {
//log.error("docx转pdf文件异常:{}",e);
System.out.println("docx转pdf文件异常:" + e);
}finally {
try{
if(baos != null){
baos.close();
}
}catch (IOException e){
//log.error("docx转pdf关闭io流异常:{}",e);
}
}
return resBytes;
}
}
本次测试用到的poi jar包版本3.16,itextpdf版本5.5.13,itext-asian版本5.2.0。
jar包下载:
- https://mvnrepository.com/artifact/org.apache.poi/poi
- https://mvnrepository.com/artifact/com.itextpdf/itextpdf
- https://mvnrepository.com/artifact/com.itextpdf/itext-asian
当前的问题是word中的表格未读取解析。