JAVA实现PDF转HTML文档的示例代码
作者:孑木文学 发布时间:2021-10-18 12:47:00
标签:JAVA,PDF,HTML
本文是基于PDF文档转PNG图片,然后进行图片拼接,拼接后的图片转为base64字符串,然后拼接html文档写入html文件实现PDF文档转HTML文档。
引入Maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.12</version>
</dependency>
工具实现类
package com.frame.utils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
/**
* PDF文档转HTML文档
* @author LXW
* @date 2020/6/17 16:45
*/
public class PdfConvertHtmlUtil {
/**
* 日志对象
*/
private static Logger logger = LoggerFactory.getLogger(PdfConvertHtmlUtil.class);
/**
* PDF文档流转Png
* @param pdfFileInputStream
* @return BufferedImage
*/
public static BufferedImage pdfStreamToPng(InputStream pdfFileInputStream){
PDDocument doc = null;
PDFRenderer renderer = null;
try {
doc = PDDocument.load(pdfFileInputStream);
renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
BufferedImage image = null;
for (int i = 0; i < pageCount; i++) {
if (image != null) {
image = combineBufferedImages(image, renderer.renderImageWithDPI(i, 144));
}
if (i == 0) {
image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
}
// BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
}
return combineBufferedImages(image);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(doc != null){doc.close();}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
*BufferedImage拼接处理,添加分割线
* @param images
* @return BufferedImage
*/
public static BufferedImage combineBufferedImages(BufferedImage... images) {
int height = 0;
int width = 0;
for (BufferedImage image : images) {
//height += Math.max(height, image.getHeight());
height += image.getHeight();
width = image.getWidth();
}
BufferedImage combo = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = combo.createGraphics();
int x = 0;
int y = 0;
for (BufferedImage image : images) {
//int y = (height - image.getHeight()) / 2;
g2.setStroke(new BasicStroke(2.0f));// 线条粗细
g2.setColor(new Color(193, 193, 193));// 线条颜色
g2.drawLine(x, y, width, y);// 线条起点及终点位置
g2.drawImage(image, x, y, null);
//x += image.getWidth();
y += image.getHeight();
}
return combo;
}
/**
* 通过Base64创建HTML文件并输出html文件
* @param base64
* @param htmlPath html保存路径
*/
public static void createHtmlByBase64(String base64,String htmlPath) {
StringBuilder stringHtml = new StringBuilder();
PrintStream printStream = null;
try {
// 打开文件
printStream = new PrintStream(new FileOutputStream(htmlPath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 输入HTML文件内容
stringHtml.append("<html><head>");
stringHtml.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
stringHtml.append("<title></title>");
stringHtml.append("</head>");
stringHtml.append(
"<body style=\"\r\n" + " text-align: center;\r\n" + " background-color: #C1C1C1;\r\n" + "\">");
stringHtml.append("<img src=\"data:image/png;base64," + base64 + "\" />");
stringHtml.append("<a name=\"head\" style=\"position:absolute;top:0px;\"></a>");
//添加锚点用于返回首页
stringHtml.append("<a style=\"position:fixed;bottom:10px;right:10px\" href=\"#head\">回到首页</a>");
stringHtml.append("</body></html>");
try {
// 将HTML文件内容写入文件中
printStream.println(stringHtml.toString());
} catch (Exception e) {
e.printStackTrace();
}finally {
if(printStream != null){printStream.close();}
}
}
/**
* bufferedImage 转为 base64编码
* @param bufferedImage
* @return
*/
public static String bufferedImageToBase64(BufferedImage bufferedImage) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
String png_base64 = "";
try {
ImageIO.write(bufferedImage, "png", byteArrayOutputStream);// 写入流中
byte[] bytes = byteArrayOutputStream.toByteArray();// 转换成字节
BASE64Encoder encoder = new BASE64Encoder();
// 转换成base64串 删除 \r\n
png_base64 = encoder.encodeBuffer(bytes).trim()
.replaceAll("\n", "")
.replaceAll("\r", "");
} catch (IOException e) {
e.printStackTrace();
}
return png_base64;
}
}
测试Demo
public static void main(String[] args) {
File file = new File("F:\\111\\Files\\MySQL查询语句大全集锦(经典珍藏).pdf");
String htmlPath = "F:\\111\\Files\\MySQL查询语句大全集锦(经典珍藏).html";
InputStream inputStream = null;
BufferedImage bufferedImage = null;
try {
inputStream = new FileInputStream(file);
bufferedImage = pdfStreamToPng(inputStream);
String base64_png = bufferedImageToBase64(bufferedImage);
createHtmlByBase64(base64_png,htmlPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
if(inputStream != null){inputStream.close();}
} catch (IOException e) {
e.printStackTrace();
}
}
}
最终结果 转换后文件
转换后的文件内容
文件预览效果
来源:https://blog.csdn.net/weixin_39699061/article/details/106845430


猜你喜欢
- 为什么要限流在保证可用的情况下尽可能多增加进入的人数,其余的人在排队等待,或者返回友好提示,保证里面的进行系统的用户可以正常使用,防止系统雪
- 一:算术运算符1.算术运算符有哪些①基本四则运算符:+ - * / %②增量赋值运算符:+= -= *= /= %=③自增/自减运算符++
- 本文介绍idea的安装和基本使用首先保证JDK正常安装及配置下载地址:https://www.jetbrains.com/idea/down
- 问题:Information:java: Errors occurred while compiling module &lsquo
- springboot整合redis主从sentinel一主二从三sentinel配置1、master:127.0.0.1:63792、sla
- 有哪些“纪律”是Java程序员所要遵守的?1. 为代码添加注释(Add comments to your code). – 每个人都知道这一
- 配置文件context-path的坑context-path: /manage 这个配置加入后会导致访问spring的页面都需要加这个/ma
- 本文将介绍一种通过代码控制ListView上下滚动的方法。先上图:按下按钮会触发ListView滚动或停止。实现该功能并不难,下面给出主要代
- 代码很简单,这里就不多废话了。package cc.c;import android.app.Activity;import android
- 在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了FactoryBean类!
- 本文实例为大家分享了C# Email发送邮件的具体代码,供大家参考,具体内容如下//回执地址 var Receipt = &q
- println()直接打印我们都知道println()如果打印的是基本数据类型的话直接打印出来的就是值,你如果是引用数据类型呢?🍑除掉这四类
- 如下所示:package test.com.gjob.services; import java.util.Properties
- 前置知识在微服务项目中,如果我们想实现服务间调用,一般会选择Feign。之前介绍过一款HTTP客户端工具Retrofit,配合SpringB
- Spring框架七大模块简单介绍Spring中MVC模块代码详解Spring的WEB模块用于整合Web框架,例如Struts1、Struts
- 写应用程序的过程中,弹窗是个避免不了的功能,显示中,假设弹窗背景色和主窗口背景色相差不多,甚至是一样的时候,就会存在一个比较严重的人机交互和
- C#抓图服务首先抽象出抓图接口,然后对接口做基于公共操作的抽象类封装,之后针对不同的抓图方式做差异化处理,最后根据接口实现抓图服务。注意:W
- 目录前言一、Spring Boot对Redis的支持二、实战1、添加依赖2、redis配置3、实现序列化4、创建Redis连接工厂,同时注册
- 代码如下:/** * 动态生成SQ及SQL参数L * @param ve 接收到的消息的CHGLIST &nbs
- 该接口实现了序列化,声明为 public interface Key extends SerializableKey 是所有密钥的顶层接口。