实现原理是PDF文档先转为PNG图片,然后进行图片拼接,拼接后的图片转为base64字符串,然后放入html文档。

此方案会导致文档增大,比如100多KB的PDF文档转换HTML后会超过2MB。

引入maven依赖

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version>
</dependency>

实现工具类

package xxxxx;import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import sun.misc.BASE64Encoder;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.*;/*** PDF文档转HTML文档工具类*/
@Slf4j
public class PdfConvertHtmlUtil {/*** PDF文档流转Png** @param input* @return BufferedImage*/public static BufferedImage pdfStreamToPng(byte[] input) {PDDocument doc = null;PDFRenderer renderer = null;try {doc = PDDocument.load(input);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.renderImage(i));}if (i == 0) {// 设置图片的分辨率image = renderer.renderImage(i); // Windows native DPI// 如果是PNG图片想要背景透明的话使用下面这个// BufferedImage image = render.renderImageWithDPI(i, 296, ImageType.ARGB);}}// 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;}/*** 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;}/*** 压缩图片** @param source* @param targetW* @param targetH* @return*/private static BufferedImage resize(BufferedImage source, int targetW, int targetH) {int type = source.getType();BufferedImage target = null;double sx = (double) targetW / source.getWidth();double sy = (double) targetH / source.getHeight();if (sx > sy) {sx = sy;targetW = (int) (sx * source.getWidth());} else {sy = sx;targetH = (int) (sy * source.getHeight());}if (type == BufferedImage.TYPE_CUSTOM) {ColorModel cm = source.getColorModel();WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);boolean alphaPremultiplied = cm.isAlphaPremultiplied();target = new BufferedImage(cm, raster, alphaPremultiplied, null);} else {target = new BufferedImage(targetW, targetH, type);}Graphics2D g = target.createGraphics();g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));g.dispose();return target;}/*** 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保存路径* @param title    html标题*/public static void createHtmlByBase64(String base64, String htmlPath, String title) {PrintStream printStream = null;try {// 打开文件printStream = new PrintStream(new FileOutputStream(htmlPath));} catch (FileNotFoundException e) {log.error("create file error!", e);return;}try {// 将HTML文件内容写入文件中String htmlString = getHtmlString(base64, title);printStream.println(htmlString);} catch (Exception e) {log.error("createHtmlByBase64 error!", e);} finally {printStream.close();}}/*** 通过Base64创建HTML文件并输出html文件** @param base64*/public static String getHtmlString(String base64, String title) {StringBuilder stringHtml = new StringBuilder();// 输入HTML文件内容stringHtml.append("<html><head>");stringHtml.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");stringHtml.append("<title>").append(title).append("</title>");stringHtml.append("</head>");stringHtml.append("<body style=\"" + "text-align: center;\">");stringHtml.append("<img src=\"data:image/png;base64,").append(base64).append("\"/>");stringHtml.append("</body></html>");return stringHtml.toString();}/*** 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\npng_base64 = encoder.encodeBuffer(bytes).trim().replaceAll("\n", "").replaceAll("\r", "");} catch (IOException e) {e.printStackTrace();}return png_base64;}// 测试public static void main(String[] args) {File file = new File("/opt/app/nas/2020/0921/2593xedkyxgs.pdf");String htmlPath = "/opt/app/nas/2020/0921/2593xedkyxgs.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();}}}}

Java实现PDF转HTML相关推荐

  1. Java实现pdf和Excel的生成及数据动态插入、导出

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 作者:慢时光 cnblogs.com/Tom-shushu/ ...

  2. pdfparser java_如何使用java从PDF中提取内容?

    在Java编程中,如何使用java从PDF中提取内容? 项目的目录结构如下 - Tika的工具包可从以下网址下载:http://tika.apache.org/download.html ,只下载:t ...

  3. Java 中pdf部分内容加边线_Java 在PDF中添加骑缝章示例解析

    骑缝章是用于往来业务合同,以确保合同真实.有效的印章加盖方法,是一种防范风险的重要方式.在Java程序中,可以通过使用工具来辅助加盖这种骑缝章. 工具:Free Spire.PDF for Java ...

  4. java 其他文件转pdf_java 其他文件转成pdf java生成pdf

    java生成pdf需要用到的包pd4ml.jar 下载地址:http://download.csdn.net/detail/yanning1314/7124741 package com.cular. ...

  5. Java合并pdf文件

    Java合并pdf文件 今天帮老师整理资料需要合并pdf文件,下了许多软件发现都需要VIP才行,所以写了个程序来帮助合并,直接在主程序中修改文件路径即可,如下图: 主要代码如下: package co ...

  6. java根据pdf模版动态生成pdf

    java根据pdf模版动态生成pdf packagecom.utils;importjava.io.ByteArrayOutputStream;importjava.io.File;importjav ...

  7. java Linux icepdf,ICEpdf 6.1.1发布,Java的PDF类库

    ICEpdf 6.1.1发布,Java的PDF类库 发布时间:2016-04-05 09:32:56来源:红联作者:baihuo ICEpdf 6.1.1 发布了.ICEpdf 是一个轻量级的开源 J ...

  8. Java制作PDF转图片小工具

    背景: 前几日一位朋友突然找我帮忙将PDF转换成图片,我仗义相助,建议他使用福昕阅读器,然而他说转换需要VIP会员,老贵了.我花了半天时间寻找免费会员,结果不出所料没有找到,我一怒之下,便决定亲自动手 ...

  9. Java实现pdf文件转图片

    Java实现pdf文件转图片 文章顺序是按照测试类- -Service- -Service实现类- -工具类- - POM依赖. test测试类里 pdfPath:存放pdf源文件的地方 imgflo ...

  10. java poi pdf 导出

    java poi pdf 导出 (java poi pdf导出 文字+图片两张放置一行) 思路:流传入图片 ,pdf没有行的概念,只有列即为一行,两张图片可以先建立一列在一列总再建立两列各放置一张图片 ...

最新文章

  1. Win10-OpenCV双目相机开发
  2. 强化学习笔记 experience replay 经验回放
  3. Oracle Service Bus –线程阻塞案例研究
  4. 兼容所有浏览器的设为首页收藏本站js代码,推荐使用
  5. mysql基础之查询缓存、存储引擎
  6. 严格模式 Strict Mode,与ES2020同步
  7. linux wifi自动消失,linux没有wifi
  8. 3D打印探讨:三个应用方向与四项风险
  9. 本地访问阿里云服务器不需要密码,怎么操作
  10. Dell戴尔笔记本电脑G16 7620原装出厂Windows11系统恢复原厂oem系统
  11. 国科大 计算机网络 复习整理笔记
  12. Windwos2008如何关闭IE增强的安全配置
  13. 【程序人生】虚拟现实(VR)版霍兰德职业兴趣岛测试
  14. 关于sentinel LDK加密war包实现应用加密的使用方法
  15. (集成电路卡)ID卡
  16. 第三方ZXing库zxing-android-embedded使用及自定义
  17. 最老程序员创业开发实训13---Android---网络请求与异步任务
  18. kkt条件里面的松弛互补条件推导
  19. 【物联网赛题】智能商超系统
  20. Lombok使用详解

热门文章

  1. java 替换所有中文_java 替换中文
  2. 深入浅出数据分析 - 直方图
  3. c语言二级选择题APP,C语言二级考试题库
  4. 江苏计算机二级c语言考试范围,江苏省计算机二级C语言考试大纲
  5. 2021电工杯数学建模B题代码与思路(Python)
  6. 2008年管理软件行业的七大趋势预测
  7. VC11、VC14、VC15库对应VisualStudio编译版本
  8. 在Debian 11上创建软盘镜像分配给qemu虚拟机并使用
  9. 前端学习分为几个阶段,你属于哪个阶段?
  10. android禁止电话功能,#Android# 启用“阻止模式”功能,避免半夜电话骚扰!