如何使用 Java 将 PDF 转换为文本 (TXT)

Java
306
0
0
2023-07-23

本文概述了从常规 PDF 文档中大规模提取纯文本的困难,并演示了两种有效执行该任务的 API 解决方案。

如何使用 Java 将 PDF 转换为文本 (TXT)

可能没有比便携式文档格式 (PDF) 更普遍的文件类型了(按设计)。PDF 能够容纳令人印象深刻的各种内容/对象类型并在您能想到的任何操作系统上无缝工作,作为大型和/或特殊格式文件的目标格式,PDF 在个人和专业项目环境中占据主导地位。例如,像 PowerPoint 的 PPTX 这样的文件类型通常非常大,以至于将文件导出为 PDF 是使项目可共享的唯一有效方法; Pdf 的矢量和光栅图形功能提供了一个理想的解决方案,保持原始文档的完美表示,同时实现更好的共享压缩。Microsoft Word DOCX 等格式根本无法在许多操作系统上按预期打开;PDF 版本可以轻松保留原件中包含的相同字体和格式编辑,从而使最终查看者可以看到文档的预期精确视觉表示。*插入文档*到 PDF 便利的列表不胜枚举。

如果 PDF 文档有一个主要缺点,那就是众所周知的难以编辑。事实上,几乎所有使 PDF 成为重新格式化外部/手动生成的材料的理想解决方案的所有因素,都反过来使它们成为操作起来更具挑战性的格式之一。由于 PDF 在一个文件中处理如此多不同的内容类型,它们经过大量压缩以实现易于携带的大小,这意味着打开 PDF 文档并更改其内容绝非易事。它们的设计和编程一开始就难以编辑,这无济于事。它首先使 PDF 成为一种安全可靠的格式。

那么,如果您只想从事 PDF 中提取纯文本、未格式化的文本——没有什么比这更特别的了呢?获取纯文本有用的原因有很多,但以方便、可扩展的方式提取它并不像看起来那么简单。如果您曾经尝试通过(例如)匆忙将 PDF 转换为办公文档格式(可能使用在线提供的数百种免费 PDF 转换工具之一)来提取文本,尤其是 没有人 知道原始文档格式是什么,您可能会遇到大量格式不一致、奇怪的间距问题、缺少链接或媒体文件,以及随机行或表格在不应该出现的地方浮动。

当您只想要纯文本部分时,这种混乱会让人分心,而且您仍然需要将文本与新文档分开并手动对其进行规范化。如果您尝试使用相同的工具扫描或光栅化的 PDF(完全由带有像素的二维图像组成)中提取文本,您可能已经注意到这根本不可能——至少,并非没有专门的光学字符识别 ( OCR )服务; 一个非常独立但同样重要的人 PDF 到文本问题的解决方案。当您尝试从常规 PDF 文档中获取纯文本时,您真正想做的是隔离 PDF 的许多可能内容类型中的一个特定部分,并 保留其中的文本内容。此外,您还要求以任何平台上的任何人都可以阅读的方式对文本进行规范化,该文本可能包含许多内容 Microsoft Word 等专有应用程序编码的复杂格式。

由于在 PDF 上执行简单的编辑任务相对困难,因此通常使用第三方 PDF 编辑器(或高级 Adob​e 工具)来获得所需的结果。这些解决方案虽然在逐个文件的基础上有效,但并不适合大规模实现结果——它们仍然需要通过界面进行手动导航,这会占用大多数人不必浪费在高效率上的时间。体积转换任务。

要大规模编辑和处理 PDF,第三方 API 服务是最有效的解决方案。这是因为 PDF 编辑 API 可以与压缩的 PDF 文件进行通信,而无需打开它;他们可以进行有意义的编辑(例如旋转页面、删除评论等),并且在另一方面,他们可以提取目标内容 而不 会对原始文​​档产生任何影响。

示范

在本文的演示部分,我将向您介绍两个简单易用的 API 解决方案,它们旨在从常规 PDF 文档中提取纯文本,而无需打开或对原始文件进行任何更改。这些 API 解决方案包括:

  1. 将 PDF 转换为文本 (TXT)
  2. 按页将 PDF 转换为文本 (TXT)

上面列出的第一个解决方案将简单地从 PDF 文档中删除纯文本,而不执行任何其他操作(默认情况下);API 响应将包含一个带有提取文本正文的“ Text Result”字符串。下面,我提供了一个响应模型以供参考:

JSON

 {
  "Successful": true,
  "TextResult": "string"
} 

顾名思义,第二种解决方案将删除文本,同时在结果中包含每个文本部分来自的页码。此解决方案增加了对转换的更高级别的控制,确保可以以与原始 PDF 文档大致相同的顺序与结果信息进行交互,并在我们以 TXT 格式存储转换后的信息时更容易对其进行分类。以下模型显示了此响应的格式:

JSON

 {
  "Successful": true,
  " Pages ": [
    {
      "PageNumber":,
      "PageText": "string"
    }
  ]
} 

这两种解决方案还提供了一个可选的“textFormattingMode”参数,可以配置该参数以指定在进行转换时应如何处理空白。使用此功能时,可能的值是“preserveWhitespace”,它将在文档中保留空格并保留其与文本的相对位置,以及“minimizeWhitespace”,在大多数情况下不会在文档中插入更多空格。默认设置是“preserveWhitespace”。

下面,我将向您介绍如何使用 Java 中的可立即运行、互补的代码示例来利用这两种 API。请注意,要免费使用任一 API,您只需在www.cloudmersive.com上注册一个免费帐户即可获得安全的 API 密钥(此帐户每月最多可产生 800 次 API 调用)。

在调用任一 API 之前,我们将从安装 SDK 开始作为我们的第一步。我们可以通过首先在 pom .xml 中添加对存储库的引用来使用 Maven 执行此操作:

XML

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

然后添加对 pom.xml 依赖项的引用:

XML

 <dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v.25</version>
</dependency>
</dependencies> 

我们也可以通过将 gradle 添加到存储库末尾的根 build.gradle 中来执行此操作:

 allprojects {
    repositories {
        ...
    maven { url '#; }
    }
} 

然后在 build.gradle 中添加依赖:

时髦的

 dependencies {
        implementation 'com.github.Cloudmersive:Cloudmersive.APIClient.Java:v.25'
} 

现在我们可以构建我们的 API 调用,从通用 PDF 到 TXT 转换 API 开始。在下面的代码片段中,在文档指示的地方(就在导入下方)包含您的 API 密钥,然后在下面的 inputFile 参数中包含您的文件路径:

 //  Import  classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.Api Exception ;
//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");

 convert DocumentApi apiInstance = new ConvertDocumentApi();
 File  inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
String textFormattingMode = "textFormattingMode_example"; // String | Optional; specify how whitespace should be handled when converting PDF to text.  Possible values are 'preserveWhitespace' which will attempt to preserve whitespace in the document and relative positioning of text within the document, and 'minimizeWhitespace' which will not insert additional spaces into the document in most cases.  Default is 'preserveWhitespace'.
try {
    TextConversionResult result = apiInstance.convertDocumentPdfToTxt(inputFile, textFormattingMode);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ConvertDocumentApi#convertDocumentPdfToTxt");
    e.printStackTrace();
} 

对于按页将 PDF 转换为文本的解决方案,请改用以下代码段。这将以与第一个相同的方式捕获您的 API 密钥和文件输入参数:

爪哇

 // 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();
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
String textFormattingMode = "textFormattingMode_example"; // String | Optional; specify how whitespace should be handled when converting the document to text.  Possible values are 'preserveWhitespace' which will attempt to preserve whitespace in the document and relative positioning of text within the document, and 'minimizeWhitespace' which will not insert additional spaces into the document in most cases.  Default is 'preserveWhitespace'.
try {
    PdfTextByPageResult result = apiInstance.editPdfGetPdfTextByPages(inputFile, textFormattingMode);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling EditPdfApi#editPdfGetPdfTextByPages");
    e.printStackTrace();
} 

请记住,默认的 textFormattingMode 设置将在输出中保留输入 PDF 中的空白。如果您想避免这种情况,请确保将示例代码更改为“minimizeWhitespace”。有了这个解决方案,您将能够轻松地将文本从 PDF 文档重定向到各种不同的目的地,而无需打开相关文档。