将HTML转换为PDF:使用Spire.Doc的详细指南

目录

引言

1. 为什么选择 Spire.Doc?

1.1 主要特点

1.2 适用场景

2. 准备工作

2.1 引入 Spire.Doc 依赖

2.2 禁用 SSL 证书验证

3. 实现功能

3.1 主类结构

3.2 代码解析

4. 处理图像

5. 性能优化

5.1 异步下载图像

示例代码

5.2 批量处理优化

示例代码

6. 错误处理与日志管理

6.1 错误处理

示例代码

6.2 日志管理

示例代码

7. 总结


引言

在现代软件开发中,生成 PDF 文档的需求日益增长,尤其是在金融、教育、医疗等行业。PDF 格式以其固定的外观和出色的可移植性受到广泛欢迎。本文将详细介绍如何使用 Spire.Doc 库将 HTML 文件转换为 PDF 文件。本文包括完整代码示例、相关依赖管理,以及对过程中的关键概念的深入探讨。

1. 为什么选择 Spire.Doc?

Spire.Doc 是一款强大的 .NET 文档处理库,支持多种文档格式的创建、编辑和转换。使用 Spire.Doc 可以简化 HTML 转 PDF 的过程,支持复杂的 HTML 内容,包括图片、样式和链接等。

1.1 主要特点

  • 无依赖:Spire.Doc 不依赖于 Microsoft Office,可以直接在服务器端运行。
  • 高性能:能够快速处理和转换文档。
  • 易于使用:提供友好的 API 接口,便于开发者快速上手。

1.2 适用场景

  • 生成报表:将动态生成的 HTML 报告转换为 PDF。
  • 文档归档:将在线文档归档为 PDF,便于存储和分发。
  • 邮件发送:将用户生成的内容转换为 PDF,并通过邮件发送。

2. 准备工作

在开始之前,请确保你的开发环境中已配置 Java,并安装了 IDE(如 IntelliJ IDEA 或 Eclipse)。接下来,需要在项目中添加 Spire.Doc 依赖。

2.1 引入 Spire.Doc 依赖

在你的项目中,可以通过 Maven 引入 Spire.Doc,如下所示:

<dependency>  <groupId>e-iceblue</groupId>  <artifactId>spire.doc.free</artifactId>  <version>5.2.0</version>  
</dependency>

2.2 禁用 SSL 证书验证

在处理一些需要 HTTPS 连接的 HTML 内容时,可能会遇到 SSL 证书验证问题。为了避免这些问题,可以临时禁用 SSL 验证。下面是一个实现示例:

public static void disableSSLVerification() {  try {  TrustManager[] trustAllCerts = new TrustManager[]{  new X509TrustManager() {  public X509Certificate[] getAcceptedIssuers() {  return null;  }  public void checkClientTrusted(X509Certificate[] certs, String authType) {  }  public void checkServerTrusted(X509Certificate[] certs, String authType) {  }  }  };  SSLContext sc = SSLContext.getInstance("SSL");  sc.init(null, trustAllCerts, new java.security.SecureRandom());  HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());  HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);  } catch (Exception e) {  e.printStackTrace();  }  
}

3. 实现功能

接下来,我们将实现一个完整的 Java 类,通过读取 HTML 文件,将其转换为 PDF。在这个过程中,我们将重点介绍文件读取、HTML 内容处理和 PDF 文件生成的步骤。

3.1 主类结构

以下是我们的主类 DocToPdfConverter 的结构,这里包含了所有必要的方法:

package com.dahua.saas.illegalpunish.controller;  import com.spire.doc.Document;  
import com.spire.doc.FileFormat;  
import com.spire.doc.Section;  import javax.net.ssl.*;  
import java.security.cert.X509Certificate;  
import java.io.BufferedReader;  
import java.io.FileReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.net.HttpURLConnection;  
import java.net.URL;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  public class DocToPdfConverter {  public static void main(String[] args) throws IOException {  disableSSLVerification();  String inputHtml = "C:\\cloud\\dahua\\VIASBIllegalPunish\\file\\1912202400018.doc";  Document doc = new Document();  Section sec = doc.addSection();  String htmlText = readTextFromFile(inputHtml);  sec.addParagraph().appendHTML(replaceImagesWithHighRes(htmlText));  doc.saveToFile("C:\\cloud\\dahua\\VIASBIllegalPunish\\file\\1912202400018.pdf", FileFormat.PDF);  doc.dispose();  }  // 读取文本文件内容  public static String readTextFromFile(String fileName) throws IOException {  StringBuilder sb = new StringBuilder();  BufferedReader br = new BufferedReader(new FileReader(fileName));  String content;  while ((content = br.readLine()) != null) {  sb.append(content);  sb.append(System.lineSeparator());  }  return sb.toString();  }  // 替换 HTML 文本中的图片链接为高分辨率图像  public static String replaceImagesWithHighRes(String html) {  String imageUrlPattern = "https?://[^\\s\"'<>]+";  Pattern pattern = Pattern.compile(imageUrlPattern);  Matcher matcher = pattern.matcher(html);  StringBuffer resultHtml = new StringBuffer();  while (matcher.find()) {  String imageUrl = matcher.group();  String highResImage = downloadImage(imageUrl);  matcher.appendReplacement(resultHtml, highResImage);  }  matcher.appendTail(resultHtml);  return resultHtml.toString();   }  // 下载图片,返回高分辨率的图像数据  public static String downloadImage(String imageUrl) {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  // 这里可以实现将输入流转换为适合插入 PDF 的格式  return imageUrl; // 现在只是返回原始 URL  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  }  
}

3.2 代码解析

  • 禁用 SSL 验证:通过调用 disableSSLVerification() 方法来忽略 SSL 证书验证,以便可以访问 HTTP 和 HTTPS 内容。

  • 读取 HTML 文件:使用 readTextFromFile() 方法读取指定路径下的 HTML 文件。这个方法使用 BufferedReader 逐行读取,最终返回一个完整的 HTML 内容字符串。

  • 处理图片链接:在 replaceImagesWithHighRes() 方法中,首先通过正则表达式查找所有的图片链接,然后下载高分辨率的图片。在这里,具体的下载逻辑需要根据实际情况实现,例如可以选择将图像转换为 Base64 格式,并替换 HTML 内容中的 src 属性以达到嵌入图像的效果。

  • 生成 PDF:使用 Spire.Doc 库创建一个新的 Document 对象,并添加一个 Section,然后通过 appendHTML() 方法将处理后的 HTML 内容添加到文档中。最后,调用 saveToFile() 方法将文档保存为 PDF 格式的文件。

4. 处理图像

在本示例中,downloadImage 方法返回的是原始的图像 URL。在实际应用中,您可能需要将下载的图片以适当的格式嵌入 PDF,例如将其转换为 Base64 字符串。下面是一个简单的实现示例:

public static String downloadImage(String imageUrl) {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  // Convert InputStream to byte array  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image; // Assuming image is PNG  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  
}

5. 性能优化

在处理大量图像时,批量处理或异步下载可以显著提高程序的性能和响应速度。以下是一些优化建议和具体实现策略。

5.1 异步下载图像

使用 Java 的并发 API,可以实现异步下载图像。这意味着在处理 HTML 的同时,可以在后台下载图像,不阻塞主线程。

示例代码

使用 CompletableFuture 来实现异步下载图像的能力:

import java.util.concurrent.CompletableFuture;  public static CompletableFuture<String> downloadImageAsync(String imageUrl) {  return CompletableFuture.supplyAsync(() -> {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image; // 假设图像为 PNG  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  });  
}

然后在 replaceImagesWithHighRes() 方法中,使用 Java 的流处理来启动异步下载:

public static String replaceImagesWithHighRes(String html) {  String imageUrlPattern = "https?://[^\\s\"'<>]+";  Pattern pattern = Pattern.compile(imageUrlPattern);  Matcher matcher = pattern.matcher(html);  List<CompletableFuture<String>> futures = new ArrayList<>();  StringBuffer resultHtml = new StringBuffer();  while (matcher.find()) {  String imageUrl = matcher.group();  CompletableFuture<String> future = downloadImageAsync(imageUrl);  futures.add(future);  matcher.appendReplacement(resultHtml, ""); // 先将占位符放入结果 HTML  }  matcher.appendTail(resultHtml);  // 等待所有图像下载完成  CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));  allOf.join();  // 等待所有 CompletableFuture 完成  // 用下载后的图像替换  for (int i = 0; i < futures.size(); i++) {  try {  String downloadedImage = futures.get(i).get(); // 获取下载过的图像  String placeholder = ""; // 这里可以根据需要生成占位符  // 将占位符替换为实际的图像  resultHtml = new StringBuffer(resultHtml.toString().replaceFirst(Pattern.quote(placeholder), downloadedImage));   } catch (Exception e) {  e.printStackTrace();  }  }  return resultHtml.toString();   
}

通过以上方式,您可以实现图像的异步下载,从而提升程序的性能,特别是在处理大量数据时。

5.2 批量处理优化

如果 HTML 文件中包含大量的图像,您还可以采取以下措施进行批量处理:

  • 限制并发量:在实际运行中,尤其是在网络条件不确定的情况下,限制并发请求的数量可以避免请求过载和资源竞争。可以使用 Java 的信号灯(Semaphore)来控制并发。
示例代码
import java.util.concurrent.Semaphore;  private static final Semaphore semaphore = new Semaphore(5); // 最多允许 5 个并发下载  public static CompletableFuture<String> downloadImageAsync(String imageUrl) {  return CompletableFuture.supplyAsync(() -> {  try {  semaphore.acquire(); // 获取信号量  try {  // 文章前面提到的下载逻辑  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image;  } finally {  semaphore.release(); // 释放信号量  }  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  });  
}

通过这种方式,您可以控制并发量,从而降低服务器负载和提高下载成功率。

6. 错误处理与日志管理

在处理网络请求和文件操作时,错误处理至关重要。应确保在项目中实现有效的日志记录和错误处理机制。

6.1 错误处理

确保任何网络请求、文件读取和转换操作都能妥善处理异常情况。以下是一些建议:

  • 捕获并记录异常:应在每个网络请求和文件操作中捕获异常并记录详细信息,以便后期调试。
  • 使用重试机制:对于短暂的网络问题,可以使用重试逻辑重新尝试下载图像。
示例代码
public static String downloadImageWithRetry(String imageUrl, int retryCount) {  for (int i = 0; i < retryCount; i++) {  try {  return downloadImage(imageUrl); // 使用之前定义的下载逻辑  } catch (IOException e) {  if (i == retryCount - 1) {  e.printStackTrace(); // 记录最终失败的情况  }  }  }  return imageUrl; // 默认返回原始的 URL  
}

6.2 日志管理

可以使用日志框架(如 SLF4J、Log4j)来进行日志管理。将日志记录在适当的级别(例如 INFO、WARN、ERROR),可以帮助开发人员在出现问题时快速定位。

示例代码
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  public class DocToPdfConverter {  private static final Logger logger = LoggerFactory.getLogger(DocToPdfConverter.class);  public static void main(String[] args) {  try {  // 主逻辑  } catch (Exception e) {  logger.error("Error occurred during PDF conversion", e);  }  }  
}

7. 总结

本文介绍了如何使用 Spire.Doc 将 HTML 文件转换为 PDF 的详细过程。我们探讨了图像处理方法,包括同步和异步下载,并提供了实用的性能优化建议。此外,我们还强调了错误处理和日志管理的重要性,以增强代码的健壮性。

应用这些技术,您将能够高效地处理 HTML 文档,转化为高质量的 PDF 格式,满足现代软件开发中的各种需求。如需进一步信息或帮助,欢迎随时联系我解答您的疑问。希望本文能够为您的开发工作提供实用的参考和指导!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Buildroot如何配置qtwebengine [未能成功编译]

目录 前言 下载Buildroot 如何添加qtwebengine 开始make编译 编译过程中到了这些问题 前言 问题的开始就在于学习QT的过程中遇到了一个问题… Unknown module(s) in QT: webenginewidgets 我想要把qt的一个项目编译并发送到我的开发板上&#xff0c;但是qmake识别不到这…

SNP与Scheer合作助力Warsteiner Brauerei成功升级至SAP S/4HANA

德国软件和咨询公司SNP是SAP环境中数字化转型、自动化数据迁移和数据管理软件的知名提供商&#xff0c;再次与德国Scheer公司合作&#xff0c;Scheer公司是一家专门从事业务流程管理和SAP咨询的咨询公司。他们为家族企业Warsteiner Brauerei Haus Cramer KG向SAP S/4HANA升级转…

【Super Tilemap Editor使用详解】(五):图块调色板

1、图块调色板&#xff08;Tile Palette&#xff09;可以在以下位置找到&#xff1a; Tileset Inspector检视面板 STETilemap Inspector检视面板&#xff0c;并选择 "Paint" 选项卡 Tile Palette 窗口&#xff1a;"SuperTilemapEditor/Window/Tile Palette Win…

LNMP+discuz论坛

0.准备 文章目录 0.准备1.nginx2.mysql2.1 mysql82.2 mysql5.7 3.php4.测试php访问mysql5.部署 Discuz6.其他 yum源&#xff1a; # 没有wget&#xff0c;用这个 # curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo[rootlocalhost ~]#…

TRELLIS,一键生成3D模型,图像转3D,微软开源

大家好&#xff01;今天给大家分享微软最近开源的一个3D模型生成项目——TRELLIS。简单来说就是输入一张图片&#xff0c;它就能自动帮你生成3D模型。这与之前分享的TripoSR项目类似&#xff0c;但是精度和贴图细节比TripoSR要高很多。 好久没关注AI生成3D模型这块&#xff0c;…

开源架构学习指南:文档与资源的智慧锦囊

开源架构学习指南&#xff1a;文档与资源的智慧锦囊 一、引言二、开源架构文档的核心价值剖析&#xff08;一&#xff09;知识传承与共享&#xff1a;智慧的薪火相传1. 经典案例&#xff1a;Linux 内核文档 —— 开源世界的智慧基石 &#xff08;二&#xff09;促进协作与沟通&…

景联文科技:精准语音标注,驱动语音技术新发展

在人工智能迅速发展的今天&#xff0c;语音技术的应用已经渗透到我们生活的方方面面。从智能音箱、语音助手到自动语音识别系统&#xff0c;高质量的语音数据是这些应用成功的关键。景联文科技作为领先的AI数据服务提供商&#xff0c;专注于为客户提供高精度、高效的语音标注服…

HTTP接口报错详解与解决 200,500,403,408,404

前言&#xff1a; 仅做学习记录&#xff0c;侵删 背景 当后端编写接口时&#xff0c;经常需要对接口使用ApiFox或者PostMan进行测试&#xff0c;此时就会出现各种各样的报错&#xff0c;一般都会包括报错编码&#xff1a;200,400,401等。这个状态码一般是服务器所返回的包含…

NVIDIA发布紧凑型生成式AI超级计算机:性能提升,价格更低

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

upload-labs(1-19关)通关攻略

Pass-01 本关思路&#xff1a;删除前端js校验 进入第一关环境 桌面新建一个php文件&#xff0c;命名为1.php <?php eval($_POST[a]);?> 我们上传此文件&#xff0c;发现不允许上传&#xff0c;且页面没有变化&#xff0c;说明前端进行了拦截 这时我们打开 F12 &…

【开源库 | minizip】Linux(Ubuntu18.04)下,minizip的编译、交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-20 …

uniapp地址类 方法

关于点击没反应 manifest.json 检查是否添加了对应的权限 /* 小程序特有相关 */"mp-weixin" : {"appid" : "wxc481f10754f1d9df","setting" : {"urlCheck" : false,"es6" : true,"postcss" : true,&qu…

WebContainerapi 基础(Web IDE 技术探索 一)

前言 随着web技术的发展&#xff0c;在网页端直接运行node.js、实现微型操作系统已经不再是难事。今天介绍的 WebContainers就是一个基于浏览器的运行时&#xff0c;用于执行 Node.js 应用程序和操作系统命令&#xff0c;它完全运行在您的浏览器页面中&#xff0c;提供了文件系…

【爬虫开发】爬虫开发从0到1全知识教程第11篇:Mongodb数据库,介绍【附代码文档】

本教程的知识点为&#xff1a;爬虫概要 爬虫基础 爬虫概述 知识点&#xff1a; 1. 爬虫的概念 requests模块 requests模块 知识点&#xff1a; 1. requests模块介绍 1.1 requests模块的作用&#xff1a; 数据提取概要 数据提取概述 知识点 1. 响应内容的分类 知识点&#xff1a…

FFmpeg 安装教程(Windows 系统)

1. 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑&#xff0c;是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FFmpeg 安装包 打开 Dpwnload FFmp…

【AutoDL】通过【SSH远程连接】【vscode】

小帅碎碎念 0. 起因1. SSH信息获取2. 给你的vscode安装支持SSH远程连接的插件3. SSH远程连接入口4. 输入密码登陆5. 总结 0. 起因 之前使用AutoDL和Jupyter进行代码编辑和执行确实很方便&#xff0c;尤其是对于交互式数据分析项目。然而&#xff0c;也存在一些限制和不便之处&…

C# 识别二维码

文章目录 一. 二维码识别技术概述二 维码识别的步骤图像预处理二维码的定位和检测二维码解码 三 常用的二维码识别库1. OpenCV2. ZXing.Net 一. 二维码识别技术概述 二维码是一种通过黑白矩阵排列来编码数据的图形符号&#xff0c;它的编码方式具有较强的容错性&#xff0c;可以…

如何在 Linux 服务器上部署 Pydio Cells 教程

简介 Pydio Cells 是一个开源的文档共享和协作平台&#xff0c;专为你的组织设计。它允许你在组织内部分享文档和文件&#xff0c;并让你完全掌控文档共享环境。 在本教程中&#xff0c;我们将向你展示如何在 Alma Linux 9 服务器上安装 Pydio Cells。你将使用 MariaDB 数据库…

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用

目录 一&#xff0c;分发器和拦截器 二&#xff0c;分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三&#xff0c;分发器处理同步请求 四&#xff0c;拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…

(2024年最新)Linux(Ubuntu) 中配置静态IP(包含解决每次重启后配置文件失效问题)

Hello! 亲爱的小伙伴们&#xff0c;大家好呀&#xff08;Smile~&#xff09;&#xff01;我是Huazzi&#xff0c;欢迎观看本篇博客&#xff0c;接下来让我们一起来学习一下Ubuntu 中如何配置静态IP吧&#xff01;祝你有所收获&#xff01; 提前对Linux有所了解的小伙伴应该知道…