65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用 iText pdfOCR 识别扫描文档中的文本

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020 年 7 月 9 日

CPOL

8分钟阅读

viewsIcon

13840

使用 iText pdfOCR 为您的工作流程生成可搜索、可归档 PDF 的教程

引言

在过去的几十年里,数字化彻底改变了文档管理。许多文档工作流程的重要组成部分是将纸质文档转换为数字信息,但扫描文档只是过程中的一步。文档管理中的主要挑战之一是处理无法访问的数据,这些数据被锁定在不可编辑的文档中。您可能会认为通过扫描包含印刷文本的文档可以编辑内容,但您所谓的数字文档实际上只是其内容的扫描图像。仅图像或扫描的 PDF 不是“真正”的数字创建的 PDF,因此无法编辑或搜索。直到最近,这类文档还必须手动转录才能访问这些数据,但光学字符识别 (OCR) 提供了一种自动化此过程的方法。

介绍 iText pdfOCR

OCR 最常见的用例之一是生成可搜索、可处理或可归档的文档。虽然一些文字处理和 PDF 应用程序现在提供 OCR 功能来使 PDF 可编辑,但对于我们许多用户所需的规模来说,手动执行此操作是不切实际的。因此,我们很自豪地发布 iText pdfOCR 附加组件,这是我们 iText 7 PDF SDK 的最新成员。iText pdfOCR 通过利用成熟且功能强大的开源 Tesseract 4 OCR 技术,为 iText Java 和 .NET 开发人员提供了一种以编程方式识别扫描文档中文本的方法。

与 Tesseract 一样,iText pdfOCR 以开源形式提供(Java.NET GitHub 存储库),并提供了一个简单但灵活的 API,允许开发人员指定使用不同的 OCR 引擎。但目前,它围绕 Tesseract 构建,因为 Tesseract 是一个流行且广泛使用的 OCR 引擎,最初由惠普于 1985 年开发,并于 2005 年开源。自 2006 年以来,其开发一直由 Google 资助,并经历了重大发展,支持超过 100 种语言的文本识别、自定义词典支持以及非标准语言、字符集和字形的训练模型。版本 4 的一个重要补充是利用长短期记忆 (LSTM) 神经网络来提高其文本识别的速度和准确性。

iText pdfOCR 在 Tesseract 之上提供的功能包括生成 PDF 1.7 文档的能力,并且还支持用于归档的 PDF/A3-u 输出。更不用说,如果您想利用其他 OCR 引擎提供的功能,您可以配置 API 使用不同的 OCR 引擎进行识别。如前所述,iText pdfOCR 可根据 AGPL 开源许可证条款提供,或可通过 iText 7 Core 商业许可证进行商业使用。

工作原理

只需将包含需要识别的文本的图像或图像列表传递给 iText pdfOCR。iText pdfOCR 接受 iText 支持的任何图像格式的输入,但如果您的文档是 PDF,您只需使用 iText 7 Core 提取包含您需要访问的文本的图像。

输出可以配置为仅文本、一个由源图像数据和包含所有识别文本的层组成的 PDF,或者一个合并层的扁平化 PDF。如果您需要文档适合长期存档存储,那么对 PDF/A-3u 输出的支持是一项额外的好处。

代码示例

在我们的第一个示例中,我们将演示如何 OCR 图像以生成符合 PDF/A-3u 标准的文档。

注意:别忘了使用代码中的 TESS_DATA_FOLDER 指定您的本地 Tesseract 数据文件的路径。您始终可以在 此处找到最准确的训练 LSTM 模型。.

import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.pdfocr.OcrPdfCreator;
import com.itextpdf.pdfocr.tesseract4.Tesseract4LibOcrEngine;
import com.itextpdf.pdfocr.tesseract4.Tesseract4OcrEngineProperties;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;


public class JDoodle {

	static final Tesseract4OcrEngineProperties tesseract4OcrEngineProperties = new Tesseract4OcrEngineProperties();
    private static List LIST_IMAGES_OCR = Arrays.asList(new File("invoice_front.jpg"));
    private static String OUTPUT_PDF = "/myfiles/hello.pdf";
	private static final String DEFAULT_RGB_COLOR_PROFILE_PATH = "profiles/sRGB_CS_profile.icm";

    public static void main(String[] args) throws IOException {

		final Tesseract4LibOcrEngine tesseractReader = new Tesseract4LibOcrEngine(tesseract4OcrEngineProperties);
        tesseract4OcrEngineProperties.setPathToTessData(new File(TESS_DATA_FOLDER));		

		OcrPdfCreatorProperties properties = new OcrPdfCreatorProperties();
        properties.setPdfLang("en"); //we need to define a language to make it PDF/A compliant

        OcrPdfCreator ocrPdfCreator = new OcrPdfCreator(tesseractReader, properties);
        try (PdfWriter writer = new PdfWriter(OUTPUT_PDF)) {
            ocrPdfCreator.createPdfA(LIST_IMAGES_OCR, writer, getRGBPdfOutputIntent()).close();
        }
    }

    public static PdfOutputIntent getRGBPdfOutputIntent() throws FileNotFoundException {
        InputStream is = new FileInputStream(DEFAULT_RGB_COLOR_PROFILE_PATH);
        return new PdfOutputIntent("", "",
                "", "sRGB IEC61966-2.1", is);
    }

}
using System.Collections.Generic;
using System.IO;
using iText.Kernel.Pdf;
using iText.Pdfocr;
using iText.Pdfocr.Tesseract4;

public class Program
{
	private static readonly Tesseract4OcrEngineProperties tesseract4OcrEngineProperties = new Tesseract4OcrEngineProperties();
    private static string OUTPUT_PDF = "/myfiles/hello.pdf";
    private const string DEFAULT_RGB_COLOR_PROFILE_PATH = @"profiles\sRGB_CS_profile.icm";
    private static IList LIST_IMAGES_OCR = new List
    {
        new FileInfo("invoice_front.jpg")
    };

    static void Main()
    {
		var tesseractReader = new Tesseract4LibOcrEngine(tesseract4OcrEngineProperties);
        tesseract4OcrEngineProperties.SetPathToTessData(new FileInfo(TESS_DATA_FOLDER));

		var properties = new OcrPdfCreatorProperties();
        properties.SetPdfLang("en"); //we need to define a language to make it PDF/A compliant

        var ocrPdfCreator = new OcrPdfCreator(tesseractReader, properties);
        using (var writer = new PdfWriter(OUTPUT_PDF))
        {
            ocrPdfCreator.CreatePdfA(LIST_IMAGES_OCR, writer, GetRgbPdfOutputIntent()).Close();
        }
    }

	static PdfOutputIntent GetRgbPdfOutputIntent()
    {
       Stream @is = new FileStream(DEFAULT_RGB_COLOR_PROFILE_PATH, FileMode.Open, FileAccess.Read);
       return new PdfOutputIntent("", "", "", "sRGB IEC61966-2.1", @is);
    }
}

默认情况下,识别出的文本将合并到输出文件中,但您可能希望将此信息分开。为此,您需要使用 OcrPdfCreatorPropertiesJava/.NET)类来定义

  • 如果您想要一个单独的文本层(以下两种选项中的任何一种都将触发文本层的创建)
    • 通过定义其名称(Java/.NET
    • 通过定义其颜色(Java/.NET)- 请记住,如果您不定义此参数,文本将是透明的。
  • 如果您想要一个单独的图像层

以下示例使用所有这些选项来识别输入 JPG 中的文本,并生成一个文本层为红色的 PDF。

import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.pdfocr.OcrPdfCreator;
import com.itextpdf.pdfocr.tesseract4.Tesseract4LibOcrEngine;
import com.itextpdf.pdfocr.tesseract4.Tesseract4OcrEngineProperties;
import com.itextpdf.pdfocr.OcrPdfCreatorProperties;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;


public class JDoodle {

	static final Tesseract4OcrEngineProperties tesseract4OcrEngineProperties = new Tesseract4OcrEngineProperties();
    private static List LIST_IMAGES_OCR = Arrays.asList(new File("invoice_front.jpg"));
    private static String OUTPUT_PDF = "/myfiles/hello.pdf";

    public static void main(String[] args) throws IOException {
		final Tesseract4LibOcrEngine tesseractReader = new Tesseract4LibOcrEngine(tesseract4OcrEngineProperties);
        tesseract4OcrEngineProperties.setPathToTessData(new File(TESS_DATA_FOLDER));

        OcrPdfCreatorProperties properties = new OcrPdfCreatorProperties();
        properties.setTextLayerName("text");
        properties.setImageLayerName("image");
        properties.setTextColor(DeviceRgb.RED);

		OcrPdfCreator ocrPdfCreator = new OcrPdfCreator(tesseractReader, properties);
        try (PdfWriter writer = new PdfWriter(OUTPUT_PDF)) {
            ocrPdfCreator.createPdf(LIST_IMAGES_OCR, writer).close();
        }
    }

}
using System.Collections.Generic;
using System.IO;
using iText.Kernel.Pdf;
using iText.Pdfocr;
using iText.Pdfocr.Tesseract4;

private static readonly Tesseract4OcrEngineProperties tesseract4OcrEngineProperties =
            new Tesseract4OcrEngineProperties();

public class Program
{
    private static string OUTPUT_PDF = "/myfiles/hello.pdf";

    private static IList LIST_IMAGES_OCR = new List
    {
        new FileInfo("invoice_front.jpg")
    };

    static void Main() {
    {
		var tesseractReader = new Tesseract4LibOcrEngine(tesseract4OcrEngineProperties);
        tesseract4OcrEngineProperties.SetPathToTessData(new FileInfo(TESS_DATA_FOLDER));

        var properties = new OcrPdfCreatorProperties();
        properties.SetTextLayerName("text");
        properties.SetImageLayerName("image");
        properties.SetTextColor(DeviceRgb.RED);

        var ocrPdfCreator = new OcrPdfCreator(tesseractReader, properties);
        using (var writer = new PdfWriter(OUTPUT_PDF))
        {
            ocrPdfCreator.CreatePdf(LIST_IMAGES_OCR, writer).Close();
        }
    }
}

由于 iText pdfOCR 基于 Tesseract 4.1,因此支持大量的 语言和脚本。您可以指定要 OCR 的语言(Java/.NET),以及使用 Tesseract4OcrEngineProperties 的 TESS_DATA_FOLDER 路径(Java/.NET)类。如果您需要识别默认 Tesseract 4 词典不支持的语言中的文本,还可以指定训练数据和自定义词典。如果您希望在 OCR 文档的单独层中使用高级排版来渲染字体,请查看 iText pdfCalligraph,这是一个 iText 7 附加组件,可轻松支持全球语言和书写系统。

更多 示例常见问题解答相关信息 可以在 iText 知识库 中找到。

用例

通过使用 iText pdfOCR,您可以生成可搜索、可归档且符合 PDF/A-3u 归档标准的 PDF 文档。这些文档还可以通过数字签名进行保护,因为自 PDF/A-2 起,PDF/A 规范就支持符合 PAdES(PDF 高级电子签名)标准的数字签名。或者,如果您只想从扫描文档中提取文本,它也可以将识别出的文本输出为文件。

pdfOCR use cases

iText pdfOCR 的用例

但这还不是全部,由于它已集成到 iText 7 SDK 中,您还可以使用其他 iText 7 组件执行额外的处理。无论您是需要从文档中提取图像和数据、执行安全的内容 redaction,还是甚至使用数据生成多语言文档,一旦您拥有可访问、可搜索的 PDF,就有多种可能性。例如,您可以

  • 使用 iText pdf2Data 提取特定信息并将其存储在数据库中,从而使其他系统能够进行进一步处理。
  • 使用 iText pdfSweep 安全地 redaction 识别出的文本。
  • 使用 iText 7 Core 使用提取的文本填充 PDF 表单字段。
  • 或者,您可以将数据合并到 HTML 模板中,然后使用 iText pdfHTML 将其转换为 PDF。
  • 使用 iText pdfCalligraph 生成支持多种语言和书写系统的 PDF。
  • 甚至可以结合使用以上所有方法。

您甚至可以使用 iText pdfRender 将最终文档转换回图像。您可能会想为什么您需要这样做,但让我们考虑一个内容 redaction 的例子。您可以识别图像中的文本,安全地删除一些文本,然后再次将其转换回图像。此外,如果只需要查看文档的副本,例如已存档文档的预览或数字签名证书,图像会非常理想。图像也很容易在移动设备或不需要 PDF 阅读器的环境中显示。

iText pdfOCR 文档工作流程示例(点击查看全图)

如果您希望以更协作的方式将识别出的文本重新用于新文档,另一种选择可能是使用 iText DITO,这是我们高便捷性的 PDF 文档生成器,它允许业务用户在数字文档工作流程中扮演更重要的角色。可以使用直观的模板编辑器设计和维护模板,并配置动态数据绑定和条件格式以注入数据并配置数据的呈现方式,所有这些都无需任何编码技能。然后,您将 JSON 作为数据馈送到 iText DITO API,该 API 将数据和模板结合起来生成所需数量的 PDF。此外,如果您在购买 iText DITO 许可证时也购买了 iText 7 Core 许可证,则可以轻松地对生成的 PDF 文档进行进一步处理和操作,以执行诸如使用加密和数字签名保护文档之类的任务,或执行文档合并和拆分等低级 PDF 操作。

OCR 的好处

使用 iText pdfOCR 之类工具的优势在于,文本识别过程可以轻松自动化并集成到您的文档工作流程中。这可以实现大规模文档处理,无论是仅用于归档目的,还是从文档中提取数据以进行进一步处理和转换。许多行业都可以从其工作流程中的自动化 OCR 处理中受益,例如银行业、法律、医疗保健、制造业等,更不用说那些经常有大量与政府政策、公民个人信息以及需要从大量印刷文档中处理的其他数据相关的纸质文件。

在后 COVID-19 世界中,这一点比以往任何时候都更加重要。随着世界各国政府实施跟踪和追踪人员活动的政策,快速轻松地处理护照扫描和医疗保险凭证等数据至关重要。再加上全球各地数字身份计划的各种实施,例如 欧洲单一数字网关 或新加坡的 国家数字身份 平台,很明显,将 OCR 自动化到文档工作流程中对于政府和公司来说都将至关重要。

关于 iText

iText 是一家在创新获奖 PDF 软件领域的全球领导者。全球数百万用户(包括开源和商业用户)使用它来创建各种用途的数字文档:发票、信用卡对账单、移动登机牌、法律归档等。

我们的客户群非常多样化,包括许多财富 500 强公司,以及小型公司和政府机构。我们坚信开源软件的价值。我们的核心库 iText 7 可根据 AGPL 许可证 提供。我们还为不希望遵守 AGPL 并希望保护其源代码的客户提供商业许可证。

如果您想试用包含 iText 7 Core 和所有附加组件的完整 iText 7 Suite,同时根据我们的商业许可证条款保护您的知识产权,您可以申请 免费 30 天试用

© . All rights reserved.