如何在Java中将HTML转换为PDF


PDF是世界上最常用的文档格式有很多原因。一方面,它的兼容性水平无与伦比-可以在PC,Mac,Linux,Web浏览器和移动平台上以完美的保真度查看PDF,没有任何问题。除此之外,它的打印质量和不变性,在便利性方面,您显然是首选。

现在转向转换问题,但是,您开始遇到一些问题。没有清晰简单的方法可以直接使用Java从HTML代码创建PDF。相反,必须首先执行整个解析和渲染过程,这听起来很有趣。那么,如何在不浪费大量开发时间的情况下实现所需的高质量结果呢?

今天,我们将研究如何通过使用API​​轻松快速地完成此任务。只需执行几个简单的设置步骤,我们就能执行与简化HTML和PDF转换有关的各种有用功能:

  • HTML document to PDF.
  • HTML string to PDF.
  • URL to PDF.
  • Editing PDFs.。

这些操作的一个特别重要的目标是在两种格式之间进行转换时保持较高的准确性。转换后将保留CSS,Javascript和图像等高级设计元素。要记住的一个细节是,图像应作为绝对URL或以base 64内联形式包含在内。

事不宜迟,让我们直接深入。

我们从库安装开始,这将首先需要Maven POM文件的存储库参考。

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

这将使Jitpack可以动态地编译我们的库。其次,我们也将需要依赖项引用:

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v3.54</version>
</dependency>
</dependencies>

接下来,让我们将注意力转移到我们的控制器上。我们首先需要将导入内容添加到文件顶部。

// Import classes:
import com.cloudmersive.client.invoker.ApiClient;
import com.cloudmersive.client.invoker.ApiException;
import com.cloudmersive.client.invoker.Configuration;
import com.cloudmersive.client.invoker.auth.*;
import com.cloudmersive.client.ConvertDocumentApi;

现在我们可以调用函数了,下面让我们看下面的示例代码:

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ConvertDocumentApi apiInstance = new ConvertDocumentApi();
File inputFile = new File("/path/to/file"); // File | Input file to perform the operation on.
try {
    byte[] result = apiInstance.convertDocumentHtmlToPdf(inputFile);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ConvertDocumentApi#convertDocumentHtmlToPdf");
    e.printStackTrace();
}

为了使这项工作有效,我们需要确保以下几点:

提供有效的HTML文档作为inputFile。 使用我们的API实例调用函数convertDocumentHtmlToPdf。 设置API密钥,该密钥可从Cloudmersive网站免费(永久)获得,最多允许使用所有可用API进行1,000次调用。 就像这样,您已经设置好了。请注意,上面的功能旨在与HTML文档一起使用。那么,如果我们有一个HTML字符串呢?过程本质上是相同的,但是我们将调用一个不同的函数,该函数是ConvertWebApi的一部分。这意味着我们将需要更改/添加到我们的导入中以反映以下情况:

// Import classes:
import com.cloudmersive.client.invoker.ApiClient;
import com.cloudmersive.client.invoker.ApiException;
import com.cloudmersive.client.invoker.Configuration;
import com.cloudmersive.client.invoker.auth.*;
import com.cloudmersive.client.ConvertWebApi;

现在我们可以致电convertWebHtmlToPdf:

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");
ConvertWebApi apiInstance = new ConvertWebApi();
HtmlToPdfRequest input = new HtmlToPdfRequest(); // HtmlToPdfRequest | HTML to PDF request parameters
try {
    byte[] result = apiInstance.convertWebHtmlToPdf(input);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ConvertWebApi#convertWebHtmlToPdf");
    e.printStackTrace();
}

此处的主要区别在于,我们无需输入HTML文件,而是将HTML字符串添加为我们的一部分 HtmlToPdfRequest对象的。其他所有内容都与以前相同,而且起步也很简单。在此API中,还有一些相关的函数使您可以将输入的HTML转换为PNG图像,DOCX文档或纯文本字符串。

让我们继续来看一下使用URL直接从网站创建PDF。我们将再次使用ConverWebApi,因此请确保它在您的导入列表中。我们需要的功能称为convertWebUrlToPdf:

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ConvertWebApi apiInstance = new ConvertWebApi();
UrlToPdfRequest input = new UrlToPdfRequest(); // UrlToPdfRequest | URL to PDF request parameters
try {
    byte[] result = apiInstance.convertWebUrlToPdf(input);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ConvertWebApi#convertWebUrlToPdf");
    e.printStackTrace();
}

与上一个功能类似,我们创建一个请求对象,然后将所需的URL和一些可选参数(例如输出的比例因子)传递给它。很简单 还有一些相关功能,可让您从URL创建屏幕快照图像PNG或文本字符串。

那么,这个API还能对PDF做什么呢?如果您想增加一些安全性,则可以使用以下功能使用密码对PDF文件进行加密:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.EditPdfApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

EditPdfApi apiInstance = new EditPdfApi();
String ownerPassword = "ownerPassword_example"; // String | Password of a owner (creator/editor) of the PDF file (required)
String userPassword = "userPassword_example"; // String | Password of a user (reader) of the PDF file (optional)
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
String encryptionKeyLength = "encryptionKeyLength_example"; // String | Possible values are \"128\" (128-bit RC4 encryption) and \"256\" (256-bit AES encryption).  Default is 256.
Boolean allowPrinting = true; // Boolean | Set to false to disable printing through DRM.  Default is true.
Boolean allowDocumentAssembly = true; // Boolean | Set to false to disable document assembly through DRM.  Default is true.
Boolean allowContentExtraction = true; // Boolean | Set to false to disable copying/extracting content out of the PDF through DRM.  Default is true.
Boolean allowFormFilling = true; // Boolean | Set to false to disable filling out form fields in the PDF through DRM.  Default is true.
Boolean allowEditing = true; // Boolean | Set to false to disable editing in the PDF through DRM (making the PDF read-only).  Default is true.
Boolean allowAnnotations = true; // Boolean | Set to false to disable annotations and editing of annotations in the PDF through DRM.  Default is true.
Boolean allowDegradedPrinting = true; // Boolean | Set to false to disable degraded printing of the PDF through DRM.  Default is true.
try {
    byte[] result = apiInstance.editPdfSetPermissions(ownerPassword, userPassword, inputFile, encryptionKeyLength, allowPrinting, allowDocumentAssembly, allowContentExtraction, allowFormFilling, allowEditing, allowAnnotations, allowDegradedPrinting);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling EditPdfApi#editPdfSetPermissions");
    e.printStackTrace();
}

请注意,使用各种参数,您可以对各种权限(例如打印,编辑和内容提取)进行高级控制。您还可以设置加密密钥的长度和密码本身。也可以通过editPdfDecrypt进行反向操作,使您可以取消密码保护并解锁PDF文件。在此API中,还存在用于获取和设置PDF元数据,在PDF文档之间传输页面以及编辑注释以及表单字段的功能。


原文链接:http://codingdict.com