?
前言
? ?上次写了一篇word转pdf实现 java代码实现的文章教程,有粉丝留言,想看excel转pdf的文章,我牢记于心,于是抽空研究了一下,下面是文章教程。
?
excel转pdf实现思路
? ?代码实现主要依赖两个第三方jar包,一个是pdfbox,一个是aspose-cells。pdfbox包完全开源免费,aspose-cells免费版生成有水印。单纯用pdfbox 实现word转pdf的话,实现非常复杂,且样式和原来样式,保持一致的的比例很低。所以,我先用aspose-cells生成了带水印的pdf,再用pdfbox去除aspose-cells生成的水印的,最终得到了一个无水印的pdf。实现代码逻辑基本和上次写的
《JAVA实现无损word转pdf文件完整代码教程》基本一样,不同的地方是,上次是实现知道文职文本水印内容,根据水印内容去替换掉,这次是用这种方法,解析的文本出现的乱码,于是换了一下思路,找出找出文本水印的字体,根据文本水印的特殊字体来匹配替换掉。
pom文件所需依赖
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.0-RC1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aspose/aspose-cells -->
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-cells</artifactId>
<version>21.8</version>
</dependency>
项目远程仓库
??aspose-words 这个需要配置单独的仓库地址才能下载,不会配置的可以去官网直接下载jar引入项目代码中。
<repositories>
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>https://repository.aspose.com/repo/</url>
</repository>
</repositories>
核心代码实现类
package com.tarzan.reptile.demo;
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.PDResources;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
public class PdfUtils {
public static void main(String[] args) {
excelToPdf("C:\\Users\\liuya\\Desktop\\excel\\附件1-2021年洛阳市市直事业单位招聘工作人员职位表.xls");
}
/**
* Excel文件转换
* @param excelPath 需要被转换的excel全路径带文件名
* @Return void
*/
public static void excelToPdf(String excelPath) {
long old = System.currentTimeMillis();
try {
//新建一个pdf文档
String pdfPath=excelPath.substring(0,excelPath.lastIndexOf("."))+".pdf";
//Excel文件数据
Workbook wb = new Workbook(excelPath);
FileOutputStream fileOS = new FileOutputStream(pdfPath);
//保存为pdf文件
wb.save(fileOS, SaveFormat.PDF);
fileOS.close();
removeWatermark(new File(pdfPath));
//转化用时
long now = System.currentTimeMillis();
System.out.println("EXCEL 转 Pdf 共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
e.printStackTrace();
}
}
//移除文字水印
public static boolean removeWatermark(File file) {
try {
//通过文件名加载文档
PDDocument document = Loader.loadPDF(file);
PDPageTree pages = document.getPages();
Iterator<PDPage> iter = pages.iterator();
while (iter.hasNext()) {
PDPage page = iter.next();
removeFont(page,"FAAACD");
}
file.delete();
document.save(file);
document.close();
return true;
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
}
//移除文字水印
public static void removeFont(PDPage page, String cosName) {
PDResources resources = page.getResources();
COSDictionary dict1 = resources.getCOSObject();
resources.getFontNames().forEach(e -> {
COSDictionary dict2 = dict1.getCOSDictionary(COSName.FONT);
if (e.getName().equals(cosName)) {
dict2.removeItem(e);
}
page.setResources(new PDResources(dict1));
});
}
}
结果分析
以《附件1-2021年洛阳市市直事业单位招聘工作人员职位表.xls》文件为列子,转换时长为2.092秒
?原文件excel截图
?生成pdf文件截图
?通过对比,excel原来的样式和转换pdf文件后的样式基本没有变化。
相关文章推荐
JAVA实现对PDF文件加密、解密、暴力破解密码功能https://blog.csdn.net/weixin_40986713/article/details/120350764https://blog.csdn.net/weixin_40986713/article/details/120350764
干货来袭!几行代码实现pdf添加水印和去除水印https://blog.csdn.net/weixin_40986713/article/details/120198982https://blog.csdn.net/weixin_40986713/article/details/120198982
JAVA实现PDF合并、拆分代码工具类https://blog.csdn.net/weixin_40986713/article/details/120065363
? ? ?JAVA实现无损word转pdf文件完整代码教程https://blog.csdn.net/weixin_40986713/article/details/120416465
?如果有想要看的相关技术实现的文章,请在评论区留言,博主尽量满足!!!
|