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(); } } }
最終結果 轉換後文件
轉換後的文件內容
文件預覽效果
到此這篇關於JAVA實現PDF轉HTML文檔的示例代碼的文章就介紹到這瞭,更多相關JAVA PDF轉HTML 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 將InputStream轉化為base64的實例
- Java數字圖像處理之圖像灰度處理
- 25行Java代碼將普通圖片轉換為字符畫圖片和文本的實現
- java實現給圖片加鋪滿的網格式文字水印
- Java實戰之實現文件資料上傳並生成縮略圖