JAVA实现PDF转HTML文档的示例代码

作者:孑木文学 时间:2021-10-18 12:47:00 

本文是基于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();
           }
       }
   }

最终结果 转换后文件

JAVA实现PDF转HTML文档的示例代码

转换后的文件内容

JAVA实现PDF转HTML文档的示例代码

文件预览效果

JAVA实现PDF转HTML文档的示例代码

来源:https://blog.csdn.net/weixin_39699061/article/details/106845430

标签:JAVA,PDF,HTML
0
投稿

猜你喜欢

  • Android编程实现XML解析与保存的三种方法详解

    2022-04-15 00:39:01
  • 公共POI导出Excel方法详解

    2023-09-10 22:51:31
  • Android编程获取GPS数据的方法详解

    2023-09-20 16:37:34
  • java_object的简单使用详解

    2023-08-22 11:35:57
  • java使用dom4j操作xml示例代码

    2022-03-21 18:28:38
  • 深入分析Java内存区域的使用详解

    2023-09-25 23:21:29
  • Java 的 FileFilter文件过滤与readline读行操作实例代码

    2022-04-09 07:22:53
  • Android Framework如何实现Binder

    2021-12-09 03:54:20
  • c# 如何实现自动更新程序

    2021-11-20 21:02:41
  • Android中监听未接来电的2种方法

    2023-11-02 10:44:48
  • Android绘制仪表盘指针刻度

    2022-06-17 03:23:07
  • C#中反射和扩展方法如何运用

    2023-08-02 01:43:16
  • c# 删除所有的空文件夹的小例子

    2023-09-10 06:53:44
  • Android实现摄像头拍照功能

    2022-04-25 13:05:55
  • Android中手机震动的设置(Vibrator)的步骤简要说明

    2021-08-18 08:50:29
  • 详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    2021-08-04 03:16:28
  • Java一维数组和二维数组元素默认初始化值的判断方式

    2022-03-08 21:17:49
  • Jmeter常见函数使用方法汇总

    2022-01-30 19:31:45
  • Android实现手机游戏隐藏虚拟按键

    2023-01-29 02:04:55
  • Java日常练习题,每天进步一点点(8)

    2022-04-15 16:40:26
  • asp之家 软件编程 m.aspxhome.com