Word转pdf,再转图片插入PDF
WORD转PDF所需jar包:
https://yangtaotao.lanzous.com/ice1jlc
PDF转图片所需jar包:
https://yangtaotao.lanzous.com/ice169c
由于项目中之前就有,所以直接照搬。word转pdf,使用的是ASPOSE.word ,ASPOSE.word的licence需要收费
package com.biolims.report.service; import java.io.FileOutputStream; import java.io.InputStream; import com.aspose.words.Document; import com.aspose.words.License; import com.aspose.words.SaveFormat; /** * * 由于ASPOSE比较吃内存,操作大一点的文件就会堆溢出,所以请先设置好java虚拟机参数:-Xms512m -Xmx512m(参考值)<br> * 如有疑问,请在CSDN下载界面留言,或者联系QQ569925980<br> * * @author Spark * */ public class Test { /** * 获取license * * @return */ public static boolean getLicense() { boolean result = false; try { InputStream is = Test.class.getClassLoader().getResourceAsStream("\\license.xml"); License aposeLic = new License(); aposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } public static void savedocx(String inPath, String outPath) { if (!getLicense()) { return; } try { long old = System.currentTimeMillis(); Document doc = new Document(inPath);// 原始word路径 String pdfFile = outPath; FileOutputStream fileOS = new FileOutputStream(pdfFile); doc.save(fileOS, SaveFormat.PDF); long now = System.currentTimeMillis(); System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); } catch (Exception e) { e.printStackTrace(); } } /** * 支持DOC, DOCX, OOXML, RTF, HTML, OpenDocument, PDF, EPUB, XPS, SWF等相互转换<br> * * @param args */ public static void main(String[] args) { // 验证License if (!getLicense()) { return; } try { long old = System.currentTimeMillis(); Document doc = new Document("D:\\home\\lims\\报告管理需求 - 20190905.docx");// 原始word路径 String pdfFile = "D:\\home\\ff.pdf"; FileOutputStream fileOS = new FileOutputStream(pdfFile); doc.save(fileOS, SaveFormat.PDF); long now = System.currentTimeMillis(); System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); } catch (Exception e) { e.printStackTrace(); } } }
调用结合我之前发的导出word的文章
/** * 根据模板生成word * * @param path2 * 模板的路径 * @param params * 需要替换的参数 * @param tableList * 需要插入的参数,里面的list为每个表的数据 * @param fileName * 生成word文件的文件名 * @param response */ public FileInfo getWord(String path2, Map<String, Object> params, List<List<String[]>> tableList, String fileName, HttpServletResponse response) throws Exception { File file = new File(path2); InputStream is = new FileInputStream(file); CustomXWPFDocument doc = new CustomXWPFDocument(is); this.replaceInPara(doc, params); // 替换文本里面的变量 this.replaceInTable(doc, params, tableList); // 替换表格里面的变量 // OutputStream os = response.getOutputStream(); // response.setContentType("application/x-download"); // response.setHeader("Content-disposition", "attachment; filename=" + fileName); // doc.write(os); SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss"); String formFile = ConfigFileUtil.getValueByKey("file.report.form.path"); File deskFile = new File(formFile, "report" + sdf.format(new Date()) + ".docx"); String path = deskFile.getPath(); // 写到目标文件 OutputStream output = new FileOutputStream(deskFile); // document.write(output); doc.write(output); output.close(); String name = sdf.format(new Date()); String newPdfPath=formFile+"report" + name + ".pdf"; //新生成的pdf文件路径 Test.savedocx(path, newPdfPath); String newImgPdfPath = pdf2Image(newPdfPath); File p = new File(deskFile.getPath()); FileInfo fi = new FileInfo(); fi.setFileName("report" + "" + name + ".pdf"); fi.setUploadTime(new Date()); fi.setOwnerModel("ReportItem"); fi.setUseType("0"); fi.setModelContentId(""); fi.setFileType("pdf"); fi.setFilePath(newImgPdfPath); this.close(is); return fi; }
pdf转图片,再插入pdf,使PDF就算用专业软件也不能打开,但是我们领导觉得可能多页会出现问题,但是还没有好的解决办法,如果有了请评论告知,不胜感激
public static String pdf2Image(String PdfFilePath) throws Exception { File file = new File(PdfFilePath); PdfDocument template_writer_pdfdoc = new PdfDocument(new PdfReader(PdfFilePath)); Rectangle size=template_writer_pdfdoc.getFirstPage().getPageSize(); int pages = template_writer_pdfdoc.getNumberOfPages(); PDDocument pdDocument; String pdfPath=""; try { String imgPDFPath = file.getParent(); int dot = file.getName().lastIndexOf(\'.\'); String imagePDFName = file.getName().substring(0, dot); // 获取图片文件名 pdDocument = PDDocument.load(file); PDFRenderer renderer = new PDFRenderer(pdDocument); /* dpi越大转换后越清晰,相对转换速度越慢 */ StringBuffer imgFilePath = null; List<String> pathList=new ArrayList<String>(); for (int i = 0; i < pages; i++) { String imgFilePathPrefix = imgPDFPath + File.separator + imagePDFName; imgFilePath = new StringBuffer(); imgFilePath.append(imgFilePathPrefix); imgFilePath.append("_"); imgFilePath.append(String.valueOf(i + 1)); imgFilePath.append(".jpg"); File dstFile = new File(imgFilePath.toString()); BufferedImage image = renderer.renderImageWithDPI(i, 300); ImageIO.write(image, "jpg", dstFile); pathList.add(imgFilePath.toString()); } template_writer_pdfdoc.close(); File file2 = new File(imgPDFPath + File.separator + file.getName()); // 第一步:创建一个document对象。 com.itextpdf.text.Document document = new com.itextpdf.text.Document(); document.setMargins(0, 0, 0, 0); // 第二步: // 创建一个PdfWriter实例, com.itextpdf.text.pdf.PdfWriter.getInstance(document, new FileOutputStream(file2)); // 第三步:打开文档。 document.open(); for(String s:pathList) { com.itextpdf.text.Image img = com.itextpdf.text.Image.getInstance(s); img.setAlignment(com.itextpdf.text.Image.ALIGN_CENTER); img.scaleAbsoluteHeight(size.getHeight()); img.scaleAbsoluteWidth(size.getWidth()); // 根据图片大小设置页面,一定要先设置页面,再newPage(),否则无效 document.setPageSize(new com.itextpdf.text.Rectangle(size.getWidth(), size.getHeight())); document.newPage(); document.add(img); } document.close(); pdfPath=imgPDFPath + File.separator + file.getName(); } catch (IOException e) { e.printStackTrace(); }finally { } return pdfPath; }