最新要闻
- 热讯:工会代表候选人初步人选推荐情况的报告_人选和候选人的区别是什么
- 组图|2023年海南陵水黎安国际教育创新试验区知识产权沙龙活动举行
- 多家饭店因在凉皮内放黄瓜丝被罚 网友吵翻:专家科普为大家好
- 第27次参加!高考钉子户梁实愁眉苦脸出考场 直言考得不好_世界今日报
- 天天实时:Epic祝福高考学子被指配图不佳 随后换成《原神》截图
- 天天信息:灵商的组成中包括(灵商)
- 吉视传媒:公司目前没有发展和推动有esim卡业务 今日精选
- 全球短讯!青海省邮政管理局联合相关部门调研“客货邮”融合发展情况
- 世界即时看!福达合金:截至本公告披露日 公司及其控股子公司担保余额为人民币约7.86亿元
- 癫痫一年发作一次严重吗
- 什么海鱼内脏比较好吃?
- 魔域私服有合宝宝挂吗_457833415@ com 求个 有的给个 谢谢啦|今日视点
- 全球滚动:卡霍夫卡水电站大坝遭袭 扎波罗热地方官员:核电站情况稳定
- 江苏黄沙港特大桥顺利合龙 预计6月底完工
- 高温范围扩大 这些地区的高考考生和家长需注意_当前资讯
- 雷雨大风+冰雹+龙卷!黑龙江省发布龙卷预警 焦点短讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当前时讯:文档在线预览(四)将word、txt、ppt、excel、图片转成pdf来实现在线预览
@
【资料图】
目录- 事前准备
- 1、需要的maven依赖
- 2、后面用到的工具类代码:
- 一、word文件转pdf文件(支持doc、docx)
- 二、txt文件转pdf文件
- 三、PPT文件转pdf文件(支持ppt、pptx)
- ppt转pdf第一版代码
- ppt转pdf第二版代码
- ppt转pdf第三版代码(最终版)
- 四、图片转pdf文件
- 单图片转pdf第一版代码
- 单图片转pdf第二版代码
- 将文件夹下的所有图片导成一个pdf
- 五、excel文件转pdf文件
- 方式1 使用itextpdf
- 方式2 使用spire
- 工具类整体代码
事前准备
代码基于 aspose-words(用于word、txt转pdf),itextpdf(用于ppt、图片、excel转pdf),所以事先需要在项目里下面以下依赖
1、需要的maven依赖
com.luhuiguo aspose-words 23.1 org.apache.poi poi 5.2.0 org.apache.poi poi-ooxml 5.2.0 org.apache.poi poi-scratchpad 5.2.0 org.apache.poi poi-excelant 5.2.0 com.itextpdf itextpdf 5.5.13.2 com.itextpdf itext-asian 5.2.0
2、后面用到的工具类代码:
package com.fhey.service.common.utils.file;import cn.hutool.core.util.StrUtil;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.FileInputStream;import java.io.IOException;/** * @author fhey * @date 2023-04-20 11:15:58 * @description: 文件工具类 */public class FileUtil { private static final Logger logger = LoggerFactory.getLogger(FileUtil.class); //获取新文件的全路径 public static String getNewFileFullPath(String sourceFilePath, String destFilePath, String ext) { File destFile = new File(destFilePath); if (destFile.isFile()) { return destFilePath; } File sourceFile = new File(sourceFilePath); String sourceFileName = sourceFile.getName(); if (sourceFile.isFile()) { return destFilePath + File.separator + sourceFileName.substring(0, sourceFileName.lastIndexOf(StrUtil.DOT)) + StrUtil.DOT + ext; } return destFilePath + File.separator + sourceFileName + StrUtil.DOT + ext; } //判断文件是否是图片 public static boolean isImage(File file) throws IOException { FileInputStream is = new FileInputStream(file); byte[] bytes = new byte[8]; is.read(bytes); is.close(); String type = bytesToHexString(bytes).toUpperCase(); if (type.contains("FFD8FF") //JPEG(jpg) || type.contains("89504E47") //PNG || type.contains("47494638") //GIF || type.contains("49492A00") //TIFF(tif) || type.contains("424D") //Bitmap(bmp) ) { return true; } return false; } //将文件头转换成16进制字符串 public static String bytesToHexString(byte[] src) { StringBuilder builder = new StringBuilder(); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { builder.append(0); } builder.append(hv); } return builder.toString(); }}
一、word文件转pdf文件(支持doc、docx)
word转pdf的方法比较简单,aspose-words基本都被帮我们搞定了,doc、docx都能支持。
代码:
public static void wordToPdf(String wordPath, String pdfPath) throws Exception { pdfPath = FileUtil.getNewFileFullPath(wordPath, pdfPath, "pdf"); File file = new File(pdfPath); FileOutputStream os = new FileOutputStream(file); Document doc = new Document(wordPath); doc.save(os, com.aspose.words.SaveFormat.PDF); }
验证代码:
public static void main(String[] args) throws Exception { wordToPdf("D:\\书籍\\电子书\\其它\\《山海经》异兽图.docx", "D:\\test"); }
转换效果如下,格式、图文都没什么问题,doc、docx经过验证也都能转换成功
二、txt文件转pdf文件
txt文件转pdf文件代码直接复用word的即可
代码:
public static void txtToPdf(String txtPath, String pdfPath) throws Exception { wordToPdf(txtPath, pdfPath); }
验证代码:
public static void main(String[] args) throws Exception { txtToPdf("D:\\书籍\\电子书\\国外名著\\君主论.txt", "D:\\test"); }
转换效果如下
三、PPT文件转pdf文件(支持ppt、pptx)
PPT文件转pdf文件,听说你们公司不让用ppt,那就让我们把ppt转成pdf再用吧。其实从这里开始代码就开始复杂起来了,这里用到了Apache poi、itextpdf、Graphics2D三个库,于是我结合这三个库同时兼容ppt、pptx写出了第一版代码
ppt转pdf第一版代码
public static void pptToPdf(String pptPath, String pdfPath) throws IOException { pdfPath = FileUtil.getNewFileFullPath(pptPath, pdfPath, "pdf"); com.itextpdf.text.Document document = null; FileOutputStream fileOutputStream = null; PdfWriter pdfWriter = null; try { InputStream inputStream = Files.newInputStream(Paths.get(pptPath)); SlideShow, ?> slideShow; String ext = pptPath.substring(pptPath.lastIndexOf(".")); if (ext.equals(".pptx")) { slideShow = new XMLSlideShow(inputStream); } else { slideShow = new HSLFSlideShow(inputStream); } Dimension dimension = slideShow.getPageSize(); fileOutputStream = new FileOutputStream(pdfPath); //document = new com.itextpdf.text.Document(new com.itextpdf.text.Rectangle((float) dimension.getWidth(), (float) dimension.getHeight())); document = new com.itextpdf.text.Document(); pdfWriter = PdfWriter.getInstance(document, fileOutputStream); document.open(); for (Slide, ?> slide : slideShow.getSlides()) { // 设置字体, 解决中文乱码 setPPTFont(slide, "宋体"); BufferedImage bufferedImage = new BufferedImage((int) dimension.getWidth(), (int) dimension.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphics2d = bufferedImage.createGraphics(); graphics2d.setPaint(Color.white); graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12)); slide.draw(graphics2d); graphics2d.dispose(); com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(bufferedImage, null); image.scaleToFit((float) dimension.getWidth(), (float) dimension.getHeight()); document.add(image); document.newPage(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (document != null) { document.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } if (pdfWriter != null) { pdfWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } } private static void setPPTFont(Slide, ?> slide, String fontFamily) { // 设置字体, 解决中文乱码 for (Shape, ?> shape : slide.getShapes()) { if (shape instanceof TextShape) { TextShape textShape = (TextShape) shape; List textParagraphs = textShape.getTextParagraphs(); for (TextParagraph textParagraph : textParagraphs) { List textRuns = textParagraph.getTextRuns(); for (TextRun textRun : textRuns) { textRun.setFontFamily(fontFamily); } } } } }
验证代码:
public static void main(String[] args) throws Exception { pptToPdf("C:\\Users\\jie\\Desktop\\预览\\web\\files\\河西走廊见闻录.pptx", "D:\\test"); }
转换效果如下
可以看到转换效果并不怎么好,ppt的内容展示不全。于是我开始在网上找解决方案,结果找到了一个很神奇的解决方案,就绘制的图片先写在一个PdfPTable对象上,再把PdfPTable对象放到document离去,于是我根据这个改了改代码写出了第二版代码
ppt转pdf第二版代码
public static void pptToPdf(String pptPath, String pdfPath) throws IOException { pdfPath = FileUtil.getNewFileFullPath(pptPath, pdfPath, "pdf"); com.itextpdf.text.Document document = null; FileOutputStream fileOutputStream = null; PdfWriter pdfWriter = null; try { InputStream inputStream = Files.newInputStream(Paths.get(pptPath)); SlideShow, ?> slideShow; String ext = pptPath.substring(pptPath.lastIndexOf(".")); if (ext.equals(".pptx")) { slideShow = new XMLSlideShow(inputStream); } else { slideShow = new HSLFSlideShow(inputStream); } Dimension dimension = slideShow.getPageSize(); fileOutputStream = new FileOutputStream(pdfPath); //document = new com.itextpdf.text.Document(new com.itextpdf.text.Rectangle((float) dimension.getWidth(), (float) dimension.getHeight())); document = new com.itextpdf.text.Document(); pdfWriter = PdfWriter.getInstance(document, fileOutputStream); document.open(); PdfPTable pdfPTable = new PdfPTable(1); for (Slide, ?> slide : slideShow.getSlides()) { // 设置字体, 解决中文乱码 setPPTFont(slide, "宋体"); BufferedImage bufferedImage = new BufferedImage((int) dimension.getWidth(), (int) dimension.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphics2d = bufferedImage.createGraphics(); graphics2d.setPaint(Color.white); graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12)); slide.draw(graphics2d); graphics2d.dispose(); com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(bufferedImage, null); image.scaleToFit((float) dimension.getWidth(), (float) dimension.getHeight()); // 写入单元格 pdfPTable.addCell(new PdfPCell(image, true)); document.add(pdfPTable); pdfPTable.deleteBodyRows(); document.newPage(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (document != null) { document.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } if (pdfWriter != null) { pdfWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }
转换效果如下
可以看到ppt内容已经展示完整了,到此其实ppt转pdf功能已经基本实现了,但是显示效果依然不算完美毕竟我们其实想要的是在pdf里和在ppt看的是一样的效果,而且每页ppt的长宽其实都是一样的,所以我就在想能不能设置pdf每页的长宽,把pdf每页的长宽设置成和ppt的长宽一样。于是我开始看初始化pdf document的源码配置
com.itextpdf.text.Document document = new com.itextpdf.text.Document();
然后发现com.itextpdf.text.Document除了默认的构造函数外还有这这样一个构造函数:
public Document(Rectangle pageSize) { this(pageSize, 36.0F, 36.0F, 36.0F, 36.0F); }
然后com.itextpdf.text.Rectangle类点进去就发现了可以设置长宽的构造函数:
public Rectangle(float urx, float ury) { this(0.0F, 0.0F, urx, ury); }
于是我代码中的初始化Document进行如下调整(根据第一版代码改,第二版的PdfPTable可以不用了)
document = new com.itextpdf.text.Document();//改成如下document = new com.itextpdf.text.Document(new com.itextpdf.text.Rectangle((float) dimension.getWidth(), (float) dimension.getHeight()));
ppt转pdf第三版代码(最终版)
public static void pptToPdf(String pptPath, String pdfPath) throws IOException { pdfPath = FileUtil.getNewFileFullPath(pptPath, pdfPath, "pdf"); com.itextpdf.text.Document document = null; FileOutputStream fileOutputStream = null; PdfWriter pdfWriter = null; try { InputStream inputStream = Files.newInputStream(Paths.get(pptPath)); SlideShow, ?> slideShow; String ext = pptPath.substring(pptPath.lastIndexOf(".")); if (ext.equals(".pptx")) { slideShow = new XMLSlideShow(inputStream); } else { slideShow = new HSLFSlideShow(inputStream); } Dimension dimension = slideShow.getPageSize(); fileOutputStream = new FileOutputStream(pdfPath); //document = new com.itextpdf.text.Document(); document = new com.itextpdf.text.Document(new com.itextpdf.text.Rectangle((float) dimension.getWidth(), (float) dimension.getHeight())); pdfWriter = PdfWriter.getInstance(document, fileOutputStream); document.open(); for (Slide, ?> slide : slideShow.getSlides()) { // 设置字体, 解决中文乱码 setPPTFont(slide, "宋体"); BufferedImage bufferedImage = new BufferedImage((int) dimension.getWidth(), (int) dimension.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphics2d = bufferedImage.createGraphics(); graphics2d.setPaint(Color.white); graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12)); slide.draw(graphics2d); graphics2d.dispose(); com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(bufferedImage, null); image.scaleToFit((float) dimension.getWidth(), (float) dimension.getHeight()); document.add(image); document.newPage(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (document != null) { document.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } if (pdfWriter != null) { pdfWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }
转换效果如下
现在展示的效果已经和ppt上一样了,而且经过验证ppt和pptx都是可以转换成功的。
四、图片转pdf文件
图片转pdf用到了用到了Apache poi、itextpdf两个库,因为itextpdf支持解析的图片有限,点开c读取图片的方法com.itextpdf.text.Image.getInstance,我们可以看到这样一段源码:
Image img; if (c1 == 71 && c2 == 73 && c3 == 70) { GifImage gif = new GifImage(url); img = gif.getImage(1); img = img; return img; } if (c1 == 255 && c2 == 216) { Jpeg var39 = new Jpeg(url); return var39; } Jpeg2000 var38; if (c1 == 0 && c2 == 0 && c3 == 0 && c4 == 12) { var38 = new Jpeg2000(url); return var38; } if (c1 == 255 && c2 == 79 && c3 == 255 && c4 == 81) { var38 = new Jpeg2000(url); return var38; } if (c1 == PngImage.PNGID[0] && c2 == PngImage.PNGID[1] && c3 == PngImage.PNGID[2] && c4 == PngImage.PNGID[3]) { var12 = PngImage.getImage(url); return var12; } if (c1 == 215 && c2 == 205) { ImgWMF var37 = new ImgWMF(url); return var37; } if (c1 != 66 || c2 != 77) { RandomAccessFileOrArray ra; String file; if (c1 == 77 && c2 == 77 && c3 == 0 && c4 == 42 || c1 == 73 && c2 == 73 && c3 == 42 && c4 == 0) { ra = null; try { if (url.getProtocol().equals("file")) { file = url.getFile(); file = Utilities.unEscapeURL(file); ra = new RandomAccessFileOrArray(randomAccessSourceFactory.createBestSource(file)); } else { ra = new RandomAccessFileOrArray(randomAccessSourceFactory.createSource(url)); } img = TiffImage.getTiffImage(ra, 1); img.url = url; img = img; return img; } catch (RuntimeException var32) { if (recoverFromImageError) { img = TiffImage.getTiffImage(ra, recoverFromImageError, 1); img.url = url; Image var15 = img; return var15; } throw var32; } finally { if (ra != null) { ra.close(); } } } if (c1 == 151 && c2 == 74 && c3 == 66 && c4 == 50 && c5 == 13 && c6 == 10 && c7 == 26 && c8 == 10) { ra = null; try { if (url.getProtocol().equals("file")) { file = url.getFile(); file = Utilities.unEscapeURL(file); ra = new RandomAccessFileOrArray(randomAccessSourceFactory.createBestSource(file)); } else { ra = new RandomAccessFileOrArray(randomAccessSourceFactory.createSource(url)); } img = JBIG2Image.getJbig2Image(ra, 1); img.url = url; img = img; return img; } finally { if (ra != null) { ra.close(); } } }
由此可以可知itextpdf支持解析的图片只有gif、jpeg、png、bmp、wmf、tiff、 jbig2这几种,这些其实已经基本包含了所有主流的图片格式(百度图片:所以我用的webp格式是非主流格式?),而且图片格式不是光改后缀就行的,必须要用格式转换器转换。比如下面这张图虽然后缀是jpeg,但通过查看图片信息可知实际格式是webg格式itextpdf一样无法解析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjLHOWSY-1685380307992)(C:\Users\jie\Desktop\文章\转pdf\pic\改后缀.png)]
话不多说我们先结合Apache poi、itextpdf两个库简单协议版基本的图片转换pdf代码
单图片转pdf第一版代码
public static void imageToPdf(String imgPath, String pdfPath) throws Exception { pdfPath = FileUtil.getNewFileFullPath(imgPath, pdfPath, "pdf"); com.itextpdf.text.Document document = new com.itextpdf.text.Document(); PdfWriter.getInstance(document, Files.newOutputStream(Paths.get(pdfPath))); document.open(); com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(imgPath); image.setAlignment(com.itextpdf.text.Image.ALIGN_CENTER); document.add(image); document.close(); }
验证代码:
public static void main(String[] args) throws Exception { imageToPdf("D:\\picture\\美女\\aa37a7be4196c07f43a3f776801d1b46.jpg", "D:\\test"); }
转换效果如下
从效果可以我们可以看到这个图片其实是没有显示完全的, 其实小一点的图片是没什么问题的,但是因为pdf设置的每页都是A4大小,所以在图片过大时会显示不完整,所以我们在图片过大时需要对图片进行一些调整,调整后的代码如下:
单图片转pdf第二版代码
public static void imageToPdf(String imgPath, String pdfPath) throws Exception { pdfPath = FileUtil.getNewFileFullPath(imgPath, pdfPath, "pdf"); com.itextpdf.text.Document document = new com.itextpdf.text.Document(); PdfWriter.getInstance(document, Files.newOutputStream(Paths.get(pdfPath))); document.open(); com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(imgPath); float width = image.getWidth(); float height = image.getHeight(); float space = 50f; if (width > PageSize.A4.getWidth() - space || height > PageSize.A4.getHeight() - space) { image.scaleToFit(PageSize.A4.getWidth() - space, PageSize.A4.getHeight() - space); } image.setAlignment(com.itextpdf.text.Image.ALIGN_CENTER); document.add(image); document.close(); }
转换效果如下
可以看到现在图片已经完整的显示在pdf的页面中了,到这里你可能会有一个疑惑,为什么这次不想上面ppt转换pdf一样把pdf的页面长宽设置成和图片一样,而且去调整图片的大小呢。之所以这样做的原因是因为在接下来的多图片转换成一个pdf文件时,往往是不能确保每张图片的长宽比例是一样的,为了确保每张图片都能完整的显示,所以只能调整图片的大小。
将文件夹下的所有图片导成一个pdf
将图片一张一张的导成pdf毕竟很麻烦,比如我一个文件夹下面有很多张图片,我想将该文件夹下的所有图片都导入pdf中做个《美人谱》,我该怎么做呢?安排!于是代码调整成了下面这样
支持多图片转pdf代码:
public static void imageToPdf(String imagePath, String pdfPath) throws Exception { pdfPath = FileUtil.getNewFileFullPath(imagePath, pdfPath, "pdf"); File imageFile = new File(imagePath); File[] files; if (imageFile.isDirectory()) { files = imageFile.listFiles(); } else { files = new File[]{imageFile}; } imageToPdf(files, pdfPath); } public static void imageToPdf(File[] imageFiles, String pdfPath) throws Exception { com.itextpdf.text.Document document = new com.itextpdf.text.Document(); PdfWriter.getInstance(document, Files.newOutputStream(Paths.get(pdfPath))); document.open(); for (File file : imageFiles) { if (file.isFile() && FileUtil.isImage(file)) { try { com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(file.getAbsolutePath()); float width = image.getWidth(); float height = image.getHeight(); float space = 10f; if (width > PageSize.A4.getWidth() - space || height > PageSize.A4.getHeight() - space) { image.scaleToFit(PageSize.A4.getWidth() - space, PageSize.A4.getHeight() - space); } image.setAlignment(com.itextpdf.text.Image.ALIGN_CENTER); //document.setMargins(50, 150, 50, 50); //document.setPageSize(new com.itextpdf.text.Rectangle(width, height)); document.newPage(); document.add(image); } catch (Exception e) { logger.error("图片转换失败", e); } } } document.close(); }
验证代码:
public static void main(String[] args) throws Exception { imageToPdf("D:\\picture\\美女", "D:\\test\\美人谱.pdf"); }
转换效果如下
五、excel文件转pdf文件
其实excel转pdf在实际的应用场景中应该比较罕见,但是前面也说了这么多文件转pdf的方式了,那excel转pdf也就一并说说吧。
方式1 使用itextpdf
代码如下:
public static void excelToPdf(String excelPath, String pdfPath) throws DocumentException, IOException { pdfPath = FileUtil.getNewFileFullPath(excelPath, pdfPath, "pdf"); try (Workbook workbook = WorkbookFactory.create(new File(excelPath))) { com.itextpdf.text.Document document = new com.itextpdf.text.Document(); PdfWriter.getInstance(document, new FileOutputStream(pdfPath)); document.open(); BaseFont chineseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font font = new Font(chineseFont, 12, Font.NORMAL); DecimalFormat df = new DecimalFormat("#"); for (Sheet sheet : workbook) { PdfPTable table = new PdfPTable(sheet.getRow(0).getPhysicalNumberOfCells()); for (Row row : sheet) { for (Cell cell : row) { if (cell.getCellType() == CellType.NUMERIC) { PdfPCell pdfPCell = new PdfPCell(new Paragraph(df.format(cell.getNumericCellValue()), font)); table.addCell(pdfPCell); } else { PdfPCell pdfPCell = new PdfPCell(new Paragraph(cell.toString(), font)); table.addCell(pdfPCell); } } } table.setHeaderRows(1); document.add(table); } document.close(); } }
验证代码:
public static void main(String[] args) throws Exception { excelToPdf("C:\\Users\\jie\\Desktop\\新建 Microsoft Excel 工作表.xlsx", "D:\\test"); }
转换效果如下
方式2 使用spire
因为spire不在maven中央仓库里以及阿里云的maven仓库中,所以在使用spire之前需要现在maven中配置新的maven仓库地址,配置如下;
com.e-iceblue e-iceblue https://repo.e-iceblue.cn/repository/maven-public/
然后再pom中引入依赖:
收费:
e-iceblue spire.office 5.3.1
或者 免费的:
e-iceblue spire.office.free 5.3.1
免费版本基础功能都能用
代码:
public static void excelToPdf2(String excelPath, String pdfPath) throws DocumentException, IOException, InvalidFormatException { pdfPath = FileUtil.getNewFileFullPath(excelPath, pdfPath, "pdf"); com.spire.xls.Workbook wb = new com.spire.xls.Workbook(); wb.loadFromFile(excelPath); wb.saveToFile(pdfPath, com.spire.xls.FileFormat.PDF); }
验证代码:
public static void main(String[] args) throws Exception { excelToPdf2("C:\\Users\\jie\\Desktop\\新建 Microsoft Excel 工作表.xlsx", "D:\\test"); }
转换效果如下
工具类整体代码
好了到这里就已经将word、txt、ppt、excel、图片等文件转成pdf文件实现方式已经全部说完了,感谢阅读到这里的朋友!最后附上文中用到的工具类的整体代码:
package com.fhey.service.common.utils.file;import cn.hutool.core.util.StrUtil;import com.aspose.words.Document;import com.fhey.service.common.utils.FileUtil;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Font;import com.itextpdf.text.PageSize;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfPCell;import com.itextpdf.text.pdf.PdfPTable;import com.itextpdf.text.pdf.PdfWriter;import org.apache.poi.hslf.usermodel.*;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;import org.apache.poi.sl.usermodel.Shape;import org.apache.poi.sl.usermodel.*;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.*;import org.apache.poi.xslf.usermodel.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.awt.Color;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import java.nio.file.Files;import java.nio.file.Paths;import java.text.DecimalFormat;import java.util.List;public class FileConvertUtil { private static final Logger logger = LoggerFactory.getLogger(FileConvertUtil2.class); //将word转成pdf public static void wordToPdf(String wordPath, String pdfPath) throws Exception { pdfPath = FileUtil.getNewFileFullPath(wordPath, pdfPath, "pdf"); File file = new File(pdfPath); FileOutputStream os = new FileOutputStream(file); Document doc = new Document(wordPath); doc.save(os, com.aspose.words.SaveFormat.PDF); } //将txt转成pdf public static void txtToPdf(String txtPath, String pdfPath) throws Exception { wordToPdf(txtPath, pdfPath); } //将图片转成pdf public static void imageToPdf(String imagePath, String pdfPath) throws Exception { pdfPath = FileUtil.getNewFileFullPath(imagePath, pdfPath, "pdf"); File imageFile = new File(imagePath); File[] files; if (imageFile.isDirectory()) { files = imageFile.listFiles(); } else { files = new File[]{imageFile}; } imageToPdf(files, pdfPath); } //将图片转成pdf public static void imageToPdf(File[] imageFiles, String pdfPath) throws Exception { com.itextpdf.text.Document document = new com.itextpdf.text.Document(); PdfWriter.getInstance(document, Files.newOutputStream(Paths.get(pdfPath))); document.open(); for (File file : imageFiles) { if (file.isFile() && FileUtil.isImage(file)) { try { com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(file.getAbsolutePath()); float width = image.getWidth(); float height = image.getHeight(); float space = 10f; if (width > PageSize.A4.getWidth() - space || height > PageSize.A4.getHeight() - space) { image.scaleToFit(PageSize.A4.getWidth() - space, PageSize.A4.getHeight() - space); } image.setAlignment(com.itextpdf.text.Image.ALIGN_CENTER); //document.setMargins(50, 150, 50, 50); //document.setPageSize(new com.itextpdf.text.Rectangle(width, height)); document.newPage(); document.add(image); } catch (Exception e) { logger.error("图片转换失败", e); } } } document.close(); } //将excel文件转成pdf public static void excelToPdf(String excelPath, String pdfPath) throws DocumentException, IOException { pdfPath = FileUtil.getNewFileFullPath(excelPath, pdfPath, "pdf"); try (Workbook workbook = WorkbookFactory.create(new File(excelPath))) { com.itextpdf.text.Document document = new com.itextpdf.text.Document(); PdfWriter.getInstance(document, new FileOutputStream(pdfPath)); document.open(); BaseFont chineseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font font = new Font(chineseFont, 12, Font.NORMAL); DecimalFormat df = new DecimalFormat("#"); for (Sheet sheet : workbook) { PdfPTable table = new PdfPTable(sheet.getRow(0).getPhysicalNumberOfCells()); for (Row row : sheet) { for (Cell cell : row) { if (cell.getCellType() == CellType.NUMERIC) { PdfPCell pdfPCell = new PdfPCell(new Paragraph(df.format(cell.getNumericCellValue()), font)); table.addCell(pdfPCell); } else { PdfPCell pdfPCell = new PdfPCell(new Paragraph(cell.toString(), font)); table.addCell(pdfPCell); } } } table.setHeaderRows(1); document.add(table); } document.close(); } } //将excel文件转成pdf public static void excelToPdf2(String excelPath, String pdfPath) throws DocumentException, IOException, InvalidFormatException { pdfPath = FileUtil.getNewFileFullPath(excelPath, pdfPath, "pdf"); com.spire.xls.Workbook wb = new com.spire.xls.Workbook(); wb.loadFromFile(excelPath); wb.saveToFile(pdfPath, com.spire.xls.FileFormat.PDF); } //将html转成pdf public static void htmlToPdf(String htmlPath, String pdfPath) { try { pdfPath = FileUtil.getNewFileFullPath(pdfPath, pdfPath, "pdf"); File file = new File(pdfPath); // 新建一个空白pdf文档 FileOutputStream os = new FileOutputStream(file); Document doc = new Document(htmlPath); // Address是将要被转化的word文档 doc.save(os, com.aspose.words.SaveFormat.PDF); } catch (Exception e) { e.printStackTrace(); } } //将ppt文件转成pdf public static void pptToPdf(String pptPath, String pdfPath) throws IOException { pdfPath = FileUtil.getNewFileFullPath(pptPath, pdfPath, "pdf"); com.itextpdf.text.Document document = null; FileOutputStream fileOutputStream = null; PdfWriter pdfWriter = null; try { InputStream inputStream = Files.newInputStream(Paths.get(pptPath)); SlideShow, ?> slideShow; String ext = pptPath.substring(pptPath.lastIndexOf(".")); if (ext.equals(".pptx")) { slideShow = new XMLSlideShow(inputStream); } else { slideShow = new HSLFSlideShow(inputStream); } Dimension dimension = slideShow.getPageSize(); fileOutputStream = new FileOutputStream(pdfPath); //document = new com.itextpdf.text.Document(); document = new com.itextpdf.text.Document(new com.itextpdf.text.Rectangle((float) dimension.getWidth(), (float) dimension.getHeight())); pdfWriter = PdfWriter.getInstance(document, fileOutputStream); document.open(); for (Slide, ?> slide : slideShow.getSlides()) { // 设置字体, 解决中文乱码 setPPTFont(slide, "宋体"); BufferedImage bufferedImage = new BufferedImage((int) dimension.getWidth(), (int) dimension.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphics2d = bufferedImage.createGraphics(); graphics2d.setPaint(Color.white); graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12)); slide.draw(graphics2d); graphics2d.dispose(); com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(bufferedImage, null); image.scaleToFit((float) dimension.getWidth(), (float) dimension.getHeight()); document.add(image); document.newPage(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (document != null) { document.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } if (pdfWriter != null) { pdfWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } } private static void setPPTFont(Slide, ?> slide, String fontFamily) { // 设置字体, 解决中文乱码 for (Shape, ?> shape : slide.getShapes()) { if (shape instanceof TextShape) { TextShape textShape = (TextShape) shape; List textParagraphs = textShape.getTextParagraphs(); for (TextParagraph textParagraph : textParagraphs) { List textRuns = textParagraph.getTextRuns(); for (TextRun textRun : textRuns) { textRun.setFontFamily(fontFamily); } } } } }}
关键词:
当前时讯:文档在线预览(四)将word、txt、ppt、excel、图片转成pdf来实现在线预览
热讯:工会代表候选人初步人选推荐情况的报告_人选和候选人的区别是什么
组图|2023年海南陵水黎安国际教育创新试验区知识产权沙龙活动举行
多家饭店因在凉皮内放黄瓜丝被罚 网友吵翻:专家科普为大家好
第27次参加!高考钉子户梁实愁眉苦脸出考场 直言考得不好_世界今日报
天天实时:Epic祝福高考学子被指配图不佳 随后换成《原神》截图
天天信息:灵商的组成中包括(灵商)
吉视传媒:公司目前没有发展和推动有esim卡业务 今日精选
全球短讯!青海省邮政管理局联合相关部门调研“客货邮”融合发展情况
世界即时看!福达合金:截至本公告披露日 公司及其控股子公司担保余额为人民币约7.86亿元
职业发展战术设计:构建可持续积累的职业优势 每日关注
微控制器实时操作系统实践3任务信令和通信机制
癫痫一年发作一次严重吗
什么海鱼内脏比较好吃?
魔域私服有合宝宝挂吗_457833415@ com 求个 有的给个 谢谢啦|今日视点
全球滚动:卡霍夫卡水电站大坝遭袭 扎波罗热地方官员:核电站情况稳定
万亿美元发债潮将至 美国金融体系或酝酿流动性风险 环球新动态
新兴产业加速崛起 海洋经济破浪前行
江苏黄沙港特大桥顺利合龙 预计6月底完工
高温范围扩大 这些地区的高考考生和家长需注意_当前资讯
雷雨大风+冰雹+龙卷!黑龙江省发布龙卷预警 焦点短讯
临川区气象台发布雷电黄色预警信号【III级/较重】【2023-06-07】 每日速讯
世界看热讯:不回巴萨!曝梅西已决定加盟美国球队迈阿密国际
Mac游戏看齐Win系统 苹果新工具可快速移植游戏
2023高考来临 大学生考点摆摊卖9.85与21.1元花束:给学弟学妹加油
暗黑满级号死于掉线
梅西官宣加盟迈阿密国际 老板是贝克汉姆:5000万欧年薪+苹果分成等
【独家焦点】长城电工:6月7日融资买入130.37万元,融资融券余额8601.6万元
按照评价的不同目的可将课程评价分为-要闻
资讯推荐:金发科技:公司目前材料可应用于航天、军工领域,但暂无相关订单
手机版生存游戏推荐 自己采集物资生存
全球快资讯:读改变未来的九大算法笔记06_图形识别
麻江县气象台发布雷电黄色预警信号【Ⅲ/较重】【2023-06-07】
优博讯:公司目前生物识别技术主要为人脸识别 每日简讯
pdca管理体系是什么_pdca管理是什么意思
信濠光电:公司的3D玻璃产品销量保持快速增长,但目前收入占比相对不高-时快讯
世界热推荐:《蜘蛛侠:纵横宇宙》口碑登顶 用AI绘制自己的格温女友
最新预警!雷雨大风!|环球焦点
观焦点:中国奇谭、宝可梦、姆明……上海电视节线下放映排片来了,你最想看哪一部?
新中港06月07日主力资金大幅流出 当前热门
今日关注:B站刚崩,唯品会又崩:亿级用户网站的架构硬伤与解决方案
使用THREEJS实现一个可调节档位、可摇头的电风扇 世界短讯
【环球速看料】西力科技:中标1.26亿元国家电网电能表采购项目
焦点信息:中国的油车时代过去了!大众关闭在中国建的第一座工厂
只用45分钟!女驴友被秃鹫吃得只剩一副白骨
近6成应届生没工作 企业招聘要求扎心:名校出身仅排第5 更高学历根本不重要
天天微速讯:7大AI比拼高考作文 语文老师打分:一大批学生该恐慌了
腾讯《无畏契约》国服今日终测:服务器全天开放、20名英雄爽玩
小摩:予招商银行(03968)“增持”评级 目标价70港元
南开区市场监管局强化高考、中考期间食品安全监管保障工作
环球快看:广丰区气象台更新雷电黄色预警信号【III级/较重】【2023-06-08】
氧化铝6月19日期货挂牌交易 后市铝价走向如何?
聚焦:雷阵雨+8级阵风,将影响晚高峰!天津发布雷雨大风蓝色预警
每日视讯:天津向渤海湾增殖放流各种苗种超100万尾
宇宙最多的两个元素是氢和什么_宇宙最多的两个元素是什么
解析2023年高考北京数学卷:追根溯源考“四基” 创新情境查能力_环球要闻
2023年6月7日河南省铝矿石价格最新行情预测
每日热讯!佳木斯领导调研地面站项目
国网陇南供电公司:机械化施工助重点工程建设
全球快消息!珲春市气象台发布雷电黄色预警【III级/较大】【2023-06-07】
【全球新视野】@所有人 一起为每一位考生送上祝福!
南向资金今日净买入2.41亿港元|每日报道
散文丨水运宪:我的峡谷我的村
金百泽:公司未直接向英伟达供货
通光线缆:目前暂无产品应用在大模型计算的配套中
每日热文:吉视传媒:公司目前没有发展和推动有esim卡业务
今日热文:2012年以来首次下跌!英国5月Halifax房价同比下降1%
生活歌手_关于生活歌手介绍|每日报道
【机构关注】6月6日机构评级调高的个股 天天观察
天龙集团:公司四大系统平台已初步实现AI升级植入的运营模式 热讯
黑龙江汤原交通运输执法大队开展爱心送考
与其争夺国内第三座迪士尼,不如自己“支棱起来”
天天看热讯:中消协提示警惕培训班退费骗局
环球新动态:广东省发文进一步完善和落实积极生育支持措施
中国电信e8套餐可以用吗(中国电信e8套餐)_每日热点
世界滚动:世界房车锦标赛历届冠军(瑞典房车锦标赛2)
快看点丨各方详解公募REITs价格波动:长期投资者更看重产品分红
澳第一大行澳大利亚联邦银行禁止员工使用ChatGPT 采用自有AI系统|世界最新
创新“三问”工作法 激发人才工作“调研力”
光明时评:地面沉降致3000余人被迫离家,该如何善后 每日消息
北京住建委:已购共有产权住房取得不动产权证未满5年 不允许转让房屋产权份额_全球今热点
本科毕业可以报考中级经济师吗?
南昌市已安排近3.32亿元衔接资金赋能乡村振兴 世界消息
键盘有些键没反应是怎么回事_键盘有些键失灵怎么办
【报资讯】爱因斯坦说光速不可超越,若两束光反向发射,不就2倍光速了吗?
每日关注!济南高考生忘带身份证,民警5秒钟打出临时身份证明
济南高考生忘带身份证,民警5秒钟打出临时身份证明
当前看点!威宁县气象台发布雷电黄色预警信号【Ⅲ/较重】【2023-06-07】
环球速读:异动快报:国芳集团(601086)6月7日14点23分触及涨停板
天天速递!网络刷单被骗,对方已经拉黑我了。店铺申请退款是虚拟店铺,已经超过六个小时了
金百泽:公司未直接向英伟达供货
数据结构 in Golang:Hash Tables(哈希表)
澳柯玛(600336)6月7日主力资金净买入96.02万元 世界视点
世界杯乒乓球比赛规则是什么_环球新动态
期市收评 | 商品市场多数收跌 甲醇跌超3%
2023世界人工智能大会主题和主视觉发布,将于7月6—8日在上海举办|每日头条
世界新消息丨2023毕业生预计1158万创历史新高 近6成求职者3-5千就干
华为618福利:99元换电池、手机内存升级、昆仑玻璃更换_当前简讯
很潮很走心的晚安心语
华晨宇专辑销量(史上销量最高的专辑)_焦点速看