1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > poi对word读取(文本和图片) 修改 保存操作及word转换为PDF

poi对word读取(文本和图片) 修改 保存操作及word转换为PDF

时间:2020-02-27 10:55:06

相关推荐

poi对word读取(文本和图片) 修改 保存操作及word转换为PDF

word转换为PDF时要引入maven依赖

<dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.1.1</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.1.1</version></dependency>

import java.io.*;import java.util.UUID;import com.documents4j.api.DocumentType;import com.documents4j.api.IConverter;import com.documents4j.job.LocalConverter;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.model.PicturesTable;import org.apache.poi.hwpf.usermodel.*;import org.apache.poi.hwpf.usermodel.Picture;/*** 实现java用poi对word读取和修改保存操作** @author qi*/public class ReadAndWriteDoc {/*** 使用HWPFDocument解析word文档* wps按doc处理即可** @param path 文件路径* @param params 参数* @param flag 1:生成pdf*/public static void parseDocByHWPFDocument(String path, String params, String flag) {boolean execute = false;File tempFile = null;IConverter converter = null;try {// docx文件转换为docif (path.endsWith("docx")) {FileInputStream inputStream = new FileInputStream(new File(path));// 临时输出路径tempFile = new File("C:\\***\\" + UUID.randomUUID().toString() + ".doc");FileOutputStream outputStream = new FileOutputStream(tempFile);converter = LocalConverter.builder().build();// docx 转 doc. 成功返回trueexecute = converter.convert(inputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.DOC).execute();}if (execute) {FileInputStream is = null;if (execute) {is = new FileInputStream(tempFile);} else {is = new FileInputStream(new File(path));}HWPFDocument document = new HWPFDocument(is);ByteArrayOutputStream baos = new ByteArrayOutputStream();// 字节流,用来存储图片// When POI 3.18 is out, replace this with PictureRunMapper// PictureRunMapper pictures = new PictureRunMapper(document);PicturesSource pictures = new PicturesSource(document);PicturesTable pictureTable = document.getPicturesTable();Range r = document.getRange();// 区间for (int i = 0; i < r.numParagraphs(); i++) {Paragraph p = r.getParagraph(i);// 段落int fontSize = p.getCharacterRun(0).getFontSize();// 字号,字号和是否加粗可用来当做标题或者某一关键标识的判断boolean isBold = p.getCharacterRun(0).isBold();// 是否加粗String paragraphText = p.text();// 段落文本// 替换 / 删除if (paragraphText.contains(params)) {p.replaceText(paragraphText, "");}// 以下代码解析图片,这样获取的图片是在文档流中的,是和文本按顺序解析的,可以很好的解决图片定位问题for (int j = 0; j < p.numCharacterRuns(); j++) {CharacterRun cr = p.getCharacterRun(j);// 字符if (pictureTable.hasPicture(cr)) {Picture picture = pictures.getFor(cr);// 如果是在页面显示图片,可转换为base64编码的图片picture.writeImageContent(baos);// 将图片写入字节流}}}// 写到另一个word文件中FileOutputStream out = null;File wordFile = new File("C:\\***\\555.doc");out = new FileOutputStream(wordFile, false);// 把doc输出到输出流中document.write(out);// 删除转换后的临时文件地址tempFile.delete();out.close();File pdfFile = null;// 如果是 1 将生成的word转换为pdfif ("1".equals(flag)) {// 读取的word输入流FileInputStream inputStreamWord = new FileInputStream(wordFile);pdfFile = new File("C:\\***\\666.pdf");FileOutputStream outputStreamPdf = new FileOutputStream(pdfFile);execute = converter.convert(inputStreamWord).as(DocumentType.DOC).to(outputStreamPdf).as(DocumentType.PDF).execute();if (execute) {converter.shutDown();}}}} catch (Exception e) {e.printStackTrace();}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。