用 Java 从 PDF 读取条形码

PDF 发票、收据或报告等文件可能包含条形码形式的编码信息。我们可以以编程方式检测、识别和读取嵌入在 PDF 文档中的条形码。在本文中,我们将学习如何使用 Java 从 PDF 文档中读取条形码。此外,我们将学习如何在 Java 中从 PDF 文档中提取条形码图像。

本文将涵盖以下主题:

  1. 从 PDF 读取条形码的 Java API
  2. 从 PDF 读取条形码
  3. 将PDF转换为图像并读取条形码
  4. 从 PDF 中提取和读取条形码
  5. 使用 PngDevice 从 PDF 读取条形码
  6. 从 PDF 中查找和读取条形码图像

从 PDF 读取条形码的 Java API

要从 PDF 文档中读取条形码,我们将遵循两步过程。首先,我们将使用 Aspose.PDF for Java API 来加载 PDF 文档并将其页面呈现为光栅图像。之后,我们将使用 Aspose.BarCode for Java API 从渲染图像中读取条形码。

下载 API 的 JAR 或在基于 Maven 的 Java 应用程序中添加以下 pom.xml 配置。

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>http://repository.aspose.com/repo/</url>
</repository>
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-barcode</artifactId>
    <version>22.8</version>
</dependency>
    
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-pdf</artifactId>
    <version>22.8</version>
</dependency>

使用 Java 从 PDF 读取条形码

Aspose.PDF API 提供了表示 PDF 文档的 Document 类。 API 的 convertToPNGMemoryStream() 方法将 PDF 页面呈现为 byte[] 数组中的图像流。 Aspose.BarCode API 提供了 BarCodeReader 类,使我们能够执行 readBarCodes 操作来检测条形码。 BarCodeResult 类存储检测到的条码信息,如条码类型、代码文本、区域等参数。

我们可以按照以下步骤读取嵌入在 PDF 文档任何页面上的条形码图像:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,遍历所有页面并渲染到流中。
  3. 然后,使用流对象创建 BarCodeReader 类的实例。
  4. 之后,调用 readBarCodes() 方法获取 BarCodeResult 对象。
  5. 最后,显示条码信息。

以下代码示例展示了如何使用 Java 从 PDF 文档中读取条形码。

// 此代码示例演示如何使用 Java 从 PDF 文档中读取条形码。
// 文档的路径
String file = "C:\\Files\\BarCode\\sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
com.aspose.pdf.Document pdfDoc = new com.aspose.pdf.Document(file);

// 从第 1 页开始处理所有 PDF 页面
for (int i = 1; i <= pdfDoc.getPages().size(); ++i)
{
    // 将 PDF 页面渲染到流
    byte[] ms = pdfDoc.getPages().get_Item(i).convertToPNGMemoryStream();
    InputStream stream = new ByteArrayInputStream(ms);

    // 从页面流中识别条形码
    BarCodeReader reader = new BarCodeReader(stream);

    // 显示结果
  for (BarCodeResult result : reader.readBarCodes()) {
    System.out.println("CodeText: " + result.getCodeText());
    System.out.println("Symbology type: " + result.getCodeType());
    System.out.println(("-------------------------------"));
  }
}
CodeText: Aspose.Barcode Pdf417 Example
Symbology type: Pdf417
-------------------------------
CodeText: Aspose.Barcode QR Example
Symbology type: QR
-------------------------------
CodeText: Aspose.Barcode DataMatrix Example
Symbology type: DataMatrix

下载带条形码的输入 PDF 文档 在本博文中使用。

使用 Java 将 PDF 转换为图像并读取条形码

我们还可以通过将 PDF 页面转换为图像来从 PDF 文档中读取条形码。 API 的 PdfConverter 类允许将 PDF 文件的每一页转换为图像。之后,我们将从转换后的图像中读取条形码信息。

我们可以按照以下步骤从转换后的 PDF 页面中读取条形码:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,创建 PdfConverter 类的实例。
  3. 或者,使用 setBarcodeOptimization() 设置呈现选项。
  4. 然后,设置图像分辨率。
  5. 接下来,使用 setStartPage() 和 setEndPage() 指定要渲染为图像的页面范围。
  6. 然后,调用 doConvert() 方法将所选页面呈现为图像。
  7. 接下来,将图像保存在一个循环中。
  8. 然后,使用保存的图像文件路径创建 BarCodeReader 类的实例。
  9. 之后,调用 readBarCodes() 方法获取 BarCodeResult 对象。
  10. 最后,显示条码信息。

以下代码示例展示了如何使用 Java 将 PDF 页面转换为图像并读取条形码。

// 以下代码示例展示了如何使用 PDF Converter 将 PDF 页面转换为图像并读取条形码。
// 文档的路径
String folderPath = "C:\\Files\\BarCode\\";

// 输入文件路径
String file = folderPath + "sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
com.aspose.pdf.Document pdfDoc = new com.aspose.pdf.Document(file);

// 初始化 PdfConvertor
com.aspose.pdf.facades.PdfConverter pdfConverter = new com.aspose.pdf.facades.PdfConverter(pdfDoc);

// 设置条码优化
pdfConverter.getRenderingOptions().setBarcodeOptimization(true);

// 设置页面分辨率
// 300 dpi 是标准分辨率
pdfConverter.setResolution(new com.aspose.pdf.devices.Resolution(300));

// 设置所有页面渲染成图片
pdfConverter.setStartPage(1); //starts from page 1
pdfConverter.setEndPage(pdfConverter.getDocument().getPages().size());

// 将选定的页面渲染到图像中
pdfConverter.doConvert();
int imageCount = 1;

while (pdfConverter.hasNextImage())
{
    // 将当前页面渲染为图像
    String strBarCodeImage = folderPath + imageCount + ".jpg";
    pdfConverter.getNextImage(strBarCodeImage);

    // 从页面的渲染图像中识别条形码
    BarCodeReader reader = new BarCodeReader(strBarCodeImage);

    // 显示结果
    for (BarCodeResult result : reader.readBarCodes()) {
    System.out.println("CodeText: " + result.getCodeText());
    System.out.println("Symbology type: " + result.getCodeType());
    System.out.println(("-------------------------------"));
  }
}

使用 Java 从 PDF 中提取和读取条形码

同样,我们也可以使用 PdfExtractor 类识别嵌入在 PDF 页面上的条形码图像。它允许从 PDF 中提取图像,然后我们将从提取的图像中读取条形码信息。

我们可以按照以下步骤从提取的图像中读取条形码:

  1. 首先,创建 PdfExtractor 类的实例。
  2. 接下来,使用 bindPdf() 方法绑定输入的 PDF 文档。
  3. 然后,设置图像提取的页面范围。
  4. 接下来,调用 extractImage() 方法来提取图像。
  5. 然后,将图像保存在一个循环中。
  6. 接下来,使用图像路径创建 BarCodeReader 类的实例。
  7. 之后,调用 readBarCodes() 方法获取 BarCodeResult 对象。
  8. 最后,显示条码信息。

以下代码示例展示了如何使用 Java 从 PDF 文档中提取和读取条形码图像。

// 以下代码示例展示了如何使用 PdfExtractor 将 PDF 页面转换为图像并读取条形码。
// 文档的路径
String folderPath = "C:\\Files\\BarCode\\";

// 输入文件
String file = folderPath + "sample-PDF-with-Barcodes.pdf";

// 绑定 PDF 文档
com.aspose.pdf.facades.PdfExtractor pdfExtractor = new com.aspose.pdf.facades.PdfExtractor();
pdfExtractor.bindPdf(file);

// 设置图像提取的页面范围
pdfExtractor.setStartPage(1);
pdfExtractor.setEndPage(3);

// 提取图像
pdfExtractor.extractImage();

int imageCount = 1;

// 保存图像以循环播放
while (pdfExtractor.hasNextImage())
{
  // 保存图片
  String strBarCodeImage = folderPath + imageCount + ".jpg";
  pdfExtractor.getNextImage(strBarCodeImage);

  // 从图像中识别条形码
  BarCodeReader reader = new BarCodeReader(strBarCodeImage);

  for (BarCodeResult result : reader.readBarCodes()) {
    System.out.println("CodeText: " + result.getCodeText());
    System.out.println("Symbology type: " + result.getCodeType());
    System.out.println(("-------------------------------"));
  }
}

在 Java 中使用 PngDevice 从 PDF 读取条形码

我们还可以通过使用 API 的 PngDevice 类将 PDF 文档的页面转换为 PNG 图像来读取条形码。它提供了 process(Page page, OutputStream output) 方法,将页面转换为 PNG 并保存在输出流中。该类的processToBufferedImage(Page page)方法将页面转换为BufferedImage。

我们可以按照以下步骤将转换后的 PDF 页面中的条形码读取为 PNG 图像:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,创建 PngDevice 类的实例。
  3. 然后,遍历所有页面并调用 processToBufferedImage() 方法渲染到图像中。
  4. 接下来,使用 BufferedImage 对象创建 BarCodeReader 类的实例。
  5. 之后,调用 readBarCodes() 方法获取 BarCodeResult 对象。
  6. 最后,显示条码信息。

以下代码示例展示了如何使用 Java 转换 PDF 页面和读取条形码。

// 以下代码示例展示了如何使用 PngDevice 将 PDF 页面转换为图像并读取条形码。
// 文档的路径
String file = "C:\\Files\\BarCode\\sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
com.aspose.pdf.Document pdfDoc = new com.aspose.pdf.Document(file);

// 创建具有 300 dpi 标准分辨率的 PNG 设备
com.aspose.pdf.devices.PngDevice pngDevice = new com.aspose.pdf.devices.PngDevice(new com.aspose.pdf.devices.Resolution(300));

// 从第 1 页开始处理所有 PDF 页面
for (int i = 1; i <= pdfDoc.getPages().size(); ++i)
{
    // 将 PDF 页面渲染到缓冲图像
    BufferedImage img = pngDevice.processToBufferedImage(pdfDoc.getPages().get_Item(i));

    // 从页面的渲染图像中识别条形码
    BarCodeReader reader = new BarCodeReader(img);

    // 显示结果
    for (BarCodeResult result : reader.readBarCodes()) {
    System.out.println("CodeText: " + result.getCodeText());
    System.out.println("Symbology type: " + result.getCodeType());
    System.out.println(("-------------------------------"));
  }
}

使用 Java 从 PDF 中查找和读取条形码图像

我们可以使用 ImagePlacementAbsorber 类从 PDF 文档中查找和提取条形码图像。它执行图像使用搜索并通过 ImagePlacements 集合提供对搜索结果的访问。此方法允许识别具有原始分辨率的条形码。唯一的缺点是它可能无法正确识别矢量格式。

我们可以按照以下步骤从 PDF 文档中查找和读取条形码:

  1. 首先,使用 Document 类加载 PDF 文档。
  2. 接下来,创建 ImagePlacementAbsorber 类的实例。
  3. 然后,在循环中为每个页面调用 visit() 方法。
  4. 接下来,遍历 ImagePlacements 集合中找到的所有图像。
  5. 然后,将图像保存到内存流中。
  6. 接下来,使用流对象创建 BarCodeReader 类的实例。
  7. 之后,调用 readBarCodes() 方法获取 BarCodeResult 对象。
  8. 最后,显示条码信息。

以下代码示例展示了如何使用 Java 从 PDF 中查找和读取条形码图像。

// 此代码示例演示如何使用 ImagePlacementAbsorber 从 PDF 文档中读取条形码。
// 文档的路径
String file = "C:\\Files\\BarCode\\sample-PDF-with-Barcodes.pdf";

// 加载 PDF 文档
com.aspose.pdf.Document pdfDoc = new com.aspose.pdf.Document(file);

// 初始化 ImagePlacementAbsorber
com.aspose.pdf.ImagePlacementAbsorber imagePlacementAbsorber = new com.aspose.pdf.ImagePlacementAbsorber();

// 从第 1 页开始处理文档中的所有 PDF 页面
for (int i = 1; i <= pdfDoc.getPages().size(); ++i)
{
    // 访问页面创建图像提取器
    imagePlacementAbsorber.visit(pdfDoc.getPages().get_Item(i));

    // 从 PDF 页面中提取所有图像
    for (com.aspose.pdf.ImagePlacement imagePlacement : imagePlacementAbsorber.getImagePlacements()) {
      // 将 PDF 页面渲染到流
      byte[] ms = pdfDoc.getPages().get_Item(i).convertToPNGMemoryStream();
      InputStream stream = new ByteArrayInputStream(ms);

      // 从页面流中识别条形码
      BarCodeReader reader = new BarCodeReader(stream);

      // 显示结果
      for (BarCodeResult result : reader.readBarCodes()) {
        System.out.println("CodeText: " + result.getCodeText());
        System.out.println("Symbology type: " + result.getCodeType());
        System.out.println(("-------------------------------"));
      }
    }
}

获得免费许可证

您可以获得免费的临时许可证 试用这些库而不受评估限制。

结论

在这篇文章中,我们学习了

  • 如何检测和读取 PDF 文档中的条形码;
  • 从 PDF 文档中提取图像的各种方法;
  • 在 Java 中解码嵌入的条形码。

除了在 Java 中从 PDF 中读取条形码外,您还可以使用 Aspose.BarCode 文档Aspose.PDF 文档 了解有关 API 的更多信息。如有任何歧义,请随时在我们的 免费支持论坛 上与我们联系。

也可以看看