前言

前段时间一直使用到word文档转pdf或者pdf转word,寻思着用Java应该是可以实现的,于是花了点时间写了个文件转换工具

源码weloe/FileConversion (github.com)

主要功能就是word和pdf的文件转换,如下

  • pdf 转 word
  • pdf 转 图片
  • word 转 图片
  • word 转 html
  • word 转 pdf

实现方法

主要使用了pdfbox Apache PDFBox | A Java PDF Library以及spire.doc Free Spire.Doc for Java | 100% 免费 Java Word 组件 (e-iceblue.cn)两个工具包

pom.xml

<repositories>
<repository>
<id>com.e-iceblue</id>
<url>http://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories> <properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>3.9.0</version>
</dependency>
</dependencies>

策略接口

public interface FileConversion {

    boolean isSupport(String s);

    String convert(String pathName,String dirAndFileName) throws Exception;

}

PDF转图片实现

public class PDF2Image implements FileConversion{
private String suffix = ".jpg";
public static final int DEFAULT_DPI = 150; @Override
public boolean isSupport(String s) {
return "pdf2image".equals(s);
} @Override
public String convert(String pathName,String dirAndFileName) throws Exception {
String outPath = dirAndFileName + suffix;
if(Files.exists(Paths.get(outPath))){
throw new RuntimeException(outPath+" 文件已存在");
} pdf2multiImage(pathName,outPath,DEFAULT_DPI); return outPath;
} /**
* pdf转图片
* 多页PDF会每页转换为一张图片,下面会有多页组合成一页的方法
*
* @param pdfFile pdf文件路径
* @param outPath 图片输出路径
* @param dpi 相当于图片的分辨率,值越大越清晰,但是转换时间变长
*/
public void pdf2multiImage(String pdfFile, String outPath, int dpi) {
if (dpi <= 0) {
// 如果没有设置DPI,默认设置为150
dpi = DEFAULT_DPI;
}
try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) {
int actSize = pdf.getNumberOfPages();
List<BufferedImage> picList = new ArrayList<>();
for (int i = 0; i < actSize; i++) {
BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, dpi, ImageType.RGB);
picList.add(image);
}
// 组合图片
ImageUtil.yPic(picList, outPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}

PDF转word实现

public class PDF2Word implements FileConversion {

    private String suffix = ".doc";

    @Override
public boolean isSupport(String s) {
return "pdf2word".equals(s);
} /**
*
* @param pathName
* @throws IOException
*/
@Override
public String convert(String pathName,String dirAndFileName) throws Exception {
String outPath = dirAndFileName + suffix;
if(Files.exists(Paths.get(outPath))){
throw new RuntimeException(outPath+" 文件已存在");
} pdf2word(pathName, outPath); return outPath;
} private void pdf2word(String pathName, String outPath) throws IOException {
PDDocument doc = PDDocument.load(new File(pathName));
int pagenumber = doc.getNumberOfPages();
// 创建文件
createFile(Paths.get(outPath)); FileOutputStream fos = new FileOutputStream(outPath);
Writer writer = new OutputStreamWriter(fos, "UTF-8");
PDFTextStripper stripper = new PDFTextStripper(); stripper.setSortByPosition(true);//排序 stripper.setStartPage(1);//设置转换的开始页
stripper.setEndPage(pagenumber);//设置转换的结束页
stripper.writeText(doc, writer);
writer.close();
doc.close();
} }

word转html

public class Word2HTML implements FileConversion{
private String suffix = ".html"; @Override
public boolean isSupport(String s) {
return "word2html".equals(s);
} @Override
public String convert(String pathName, String dirAndFileName) {
String outPath = dirAndFileName + suffix;
if(Files.exists(Paths.get(outPath))){
throw new RuntimeException(outPath+" 文件已存在");
} Document doc = new Document();
doc.loadFromFile(pathName);
doc.saveToFile(outPath, FileFormat.Html);
doc.dispose();
return outPath;
}
}

word转图片

public class Word2Image implements FileConversion{
private String suffix = ".jpg"; @Override
public boolean isSupport(String s) {
return "word2image".equals(s);
} @Override
public String convert(String pathName, String dirAndFileName) throws Exception {
String outPath = dirAndFileName + suffix;
if(Files.exists(Paths.get(outPath))){
throw new RuntimeException(outPath+" 文件已存在");
} Document doc = new Document();
//加载文件
doc.loadFromFile(pathName);
//上传文档页数,也是最后要生成的图片数
Integer pageCount = doc.getPageCount();
// 参数第一个和第三个都写死 第二个参数就是生成图片数
BufferedImage[] image = doc.saveToImages(0, pageCount, ImageType.Bitmap);
// 组合图片
List<BufferedImage> imageList = Arrays.asList(image);
ImageUtil.yPic(imageList, outPath);
return outPath;
}
}

word转pdf

public class Word2PDF implements FileConversion{

    private String suffix = ".pdf";

    @Override
public boolean isSupport(String s) {
return "word2pdf".equals(s);
} @Override
public String convert(String pathName, String dirAndFileName) throws Exception {
String outPath = dirAndFileName + suffix;
if(Files.exists(Paths.get(outPath))){
throw new RuntimeException(outPath+" 文件已存在");
}
//加载word
Document document = new Document();
document.loadFromFile(pathName, FileFormat.Docx);
//保存结果文件
document.saveToFile(outPath, FileFormat.PDF);
document.close();
return outPath;
}
}

使用

输入转换方法,文件路径,输出路径(输出路径如果输入'null'则为文件同目录下同名不同后缀文件)

转换方法可选项:

  • pdf2word
  • pdf2image
  • word2html
  • word2image
  • word2pdf

例如输入:

pdf2word D:\test\testpdf.pdf null

控制台输出:

转换方法: pdf2word  文件: D:\test\testFile.pdf
转换成功!文件路径: D:\test\testFile.doc

最新文章

  1. Oracle 数据库基础学习 (七) SQL语句综合练习
  2. KindEditor编辑器For DotNet控件
  3. 使用.Net自带的GZipStream进行流压缩与解压
  4. js字符串与16进制互相转换
  5. hdu 5818 (优先队列) Joint Stacks
  6. IntentService简介
  7. FreeMarker笔记 第四章 其它
  8. Scala中的数组
  9. Altium快捷键
  10. unity中的mesh合并
  11. inux xsel 拷贝复制命令行输出放在系统剪贴板上
  12. Android -- 从源码解析Handle+Looper+MessageQueue机制
  13. CSS3 banner图片的标签效果
  14. 软件定义网络(Software Defined Network,SDN)简介
  15. [Swift]LeetCode338. 比特位计数 | Counting Bits
  16. 通过css3实现的动画导航菜单代码
  17. C# 执行CMD 命令
  18. Leetcode 999. 车的可用捕获量
  19. iptables的4表5链(未完)
  20. ng-深度学习-课程笔记-7: 优化算法(Week2)

热门文章

  1. C语言整人关机程序
  2. 11.-ORM-基本操作-创建数据
  3. a标签添加链接下划线样式
  4. nrf52——DFU升级OTA升级方式详解(基于SDK开发例程)
  5. 创建base公共组件
  6. 京东云开发者|软件架构可视化及C4模型:架构设计不仅仅是UML
  7. 写一个shell,自动执行jmeter测试脚本
  8. 【题解】CF1503B 3-Coloring
  9. Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发
  10. [CS61A] Lecture 1&amp;2&amp;3. Introduction&amp;Functions&amp;Control