在 C# 中讀取 PDF 中的條形碼

我們可以生成條形碼並將其添加到 PDF 文檔,如我的 上一篇文章 中所述。在某些情況下,我們可能需要以編程方式檢測和讀取嵌入到 PDF 文檔中的條形碼。它有助於從 PDF 文檔(如發票、收據或報告)中解碼條形碼和二維碼形式的嵌入式信息。在本文中,我們將學習如何使用 C# 從 PDF 文檔讀取條形碼。

文章應涵蓋以下主題:

  1. 從 PDF 讀取條碼的 C# API
  2. 從 PDF 讀取條碼
  3. 將 PDF 轉換為圖像並讀取條碼
  4. 使用 PngDevice 從 PDF 讀取條碼
  5. 從 PDF 中提取和讀取條碼
  6. 從 PDF 中查找和閱讀條碼圖像

從 PDF 讀取條碼的 C# API

我們將按照兩步程序從 PDF 文檔中讀取條形碼。首先,我們將使用 Aspose.PDF for .NET API 加載 PDF 文檔,然後將其頁面呈現為光柵圖像。之後,我們將使用 Aspose.BarCode for .NET API 從渲染圖像中讀取條形碼。

下載 API 的 DLL 或使用 NuGet 安裝它。

PM> Install-Package Aspose.BarCode
PM> Install-Package Aspose.PDF

使用 C# 從 PDF 讀取條形碼

Aspose.PDF API 的 Document 類表示 PDF 文檔。 API 的 ConvertToPNGMemoryStream() 函數將 PDF 頁面呈現為 PNG 內存流。 Aspose.BarCode API 的 BarCodeReader 類使我們能夠執行 ReadBarCodes 操作來檢測條形碼。 BarCodeResult類存儲檢測到的條碼信息,如條碼類型、條碼文本、區域等參數。

我們可以按照以下步驟讀取嵌入在 PDF 文檔任何頁面上的條形碼圖像:

  1. 首先,使用 Document 類加載 PDF 文檔。
  2. 接下來,遍歷所有頁面並將它們渲染到內存流。
  3. 然後,使用流對象創建 BarCodeReader 類的實例。
  4. 之後,調用 ReadBarCodes() 方法獲取 BarCodeResult 對象。
  5. 最後,顯示條碼信息。

下面的代碼示例展示瞭如何使用 C# 從 PDF 文檔中讀取條形碼。

// 此代碼示例演示如何使用 C# 從 PDF 文檔讀取條形碼。
// 文檔的路徑
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加載 PDF 文檔
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 從第 1 頁開始處理所有 PDF 頁面
for (int i = 1; i <= pdfDoc.Pages.Count; ++i)
{
    // 將 PDF 頁面渲染到流中
    MemoryStream ms = pdfDoc.Pages[i].ConvertToPNGMemoryStream();
    ms.Position = 0;

    // 從頁面的渲染圖像中識別條形碼
    BarCodeReader reader = new BarCodeReader(ms);
    
    // 顯示結果
    foreach (BarCodeResult result in reader.ReadBarCodes())
    {
        Console.WriteLine("Codetext found: " + result.CodeText);
        Console.WriteLine("Symbology: " + result.CodeType);
        Console.WriteLine("-------------------------------");
    }
}
Codetext found: Aspose.Barcode Pdf417 Example
Symbology: Pdf417
-------------------------------
Codetext found: Aspose.Barcode QR Example
Symbology: QR
-------------------------------
Codetext found: Aspose.Barcode DataMatrix Example
Symbology: DataMatrix
-------------------------------

下載帶有條形碼的輸入 PDF 文檔 本博文中使用的。

使用 C# 將 PDF 轉換為圖像並讀取條形碼

我們可以通過使用 PdfConverter 類將 PDF 頁面轉換為圖像來從 PDF 文檔中讀取條形碼。它允許將 PDF 文件的每一頁轉換為圖像,然後我們將從轉換後的圖像中讀取條形碼信息。

我們可以按照以下步驟從轉換後的 PDF 頁面中讀取條碼:

  1. 首先,使用 Document 類加載 PDF 文檔。
  2. 接下來,創建 PdfConverter 類的一個實例。
  3. 或者,設置渲染選項,例如 BarcodeOptimization。
  4. 然後,設置圖像分辨率。
  5. 接下來,指定 StartPage 和 EndPage 以將一系列頁面呈現為圖像。
  6. 然後,調用 DoConvert() 方法將選定的頁面呈現為圖像。
  7. 接下來,將圖像保存到循環流中。
  8. 然後,使用流對象創建 BarCodeReader 類的實例。
  9. 之後,調用 ReadBarCodes() 方法獲取 BarCodeResult 對象。
  10. 最後顯示條碼信息。

下面的代碼示例展示瞭如何使用 C# 將 PDF 頁面轉換為圖像並讀取條碼。

// 下面的代碼示例展示瞭如何使用 PDF Convertor 將 PDF 頁面轉換為圖像並使用 C# 讀取條碼。
// 文檔的路徑
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加載 PDF 文檔
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 初始化 PdfConvertor
Aspose.Pdf.Facades.PdfConverter pdfConverter = new Aspose.Pdf.Facades.PdfConverter(pdfDoc);

// 設置條碼優化
pdfConverter.RenderingOptions.BarcodeOptimization = true;

// 設置頁面分辨率
// 300 dpi 是標準分辨率
pdfConverter.Resolution = new Aspose.Pdf.Devices.Resolution(300);

// 設置所有頁面渲染成圖片
pdfConverter.StartPage = 1; //starts from page 1
pdfConverter.EndPage = pdfConverter.Document.Pages.Count;

// 將選定的頁面渲染到圖像中
pdfConverter.DoConvert();
while (pdfConverter.HasNextImage())
{
    // 將當前頁面渲染到內存流圖像
    MemoryStream ms = new MemoryStream();
    pdfConverter.GetNextImage(ms, ImageFormat.Png);
    ms.Position = 0;

    // 從頁面的渲染圖像中識別條形碼
    BarCodeReader reader = new BarCodeReader(ms);
    
    // 顯示結果
    foreach (BarCodeResult result in reader.ReadBarCodes())
    {
        Console.WriteLine("Codetext found: " + result.CodeText);
        Console.WriteLine("Symbology: " + result.CodeType);
        Console.WriteLine("-------------------------------");
    }
}

在 C# 中使用 PngDevice 從 PDF 讀取條形碼

這是另一種類似於前一種方法的方法。唯一不同的是,在此方法中,我們將使用 API 的 PngDevice 類將 PDF 文檔的頁面轉換為圖像。它允許將 PDF 文檔的頁面轉換為 PNG 圖像。

我們可以按照以下步驟將轉換後的 PDF 頁面中的條碼讀取為 PNG 圖像:

  1. 首先,使用 Document 類加載 PDF 文檔。
  2. 接下來,創建 PngDevice 類的實例。
  3. 然後,遍歷所有頁面並調用 Process() 方法以呈現到流中。
  4. 接下來,使用流對象創建 BarCodeReader 類的實例。
  5. 之後,調用 ReadBarCodes() 方法獲取 BarCodeResult 對象。
  6. 最後,顯示條碼信息。

下面的代碼示例展示瞭如何使用 C# 將 PDF 頁面轉換為 PNG 圖像並讀取條碼。

// 下面的代碼示例展示瞭如何使用 PngDevice 將 PDF 頁面轉換為圖像並使用 C# 讀取條碼。
// 文檔的路徑
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加載 PDF 文檔
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 使用 300 dpi 標準分辨率創建 PNG 設備
Aspose.Pdf.Devices.PngDevice pngDevice = new Aspose.Pdf.Devices.PngDevice(new Aspose.Pdf.Devices.Resolution(300));

// 從第 1 頁開始處理所有 PDF 頁面
for (int i = 1; i <= pdfDoc.Pages.Count; ++i)
{
    // 將 PDF 頁面渲染到流中
    MemoryStream ms = new MemoryStream();
    pngDevice.Process(pdfDoc.Pages[i], ms);
    ms.Position = 0;

    // 從頁面的渲染圖像中識別條形碼
    BarCodeReader reader = new BarCodeReader(ms);

    // 顯示結果
    foreach (BarCodeResult result in reader.ReadBarCodes())
    {
        Console.WriteLine("Codetext found: " + result.CodeText);
        Console.WriteLine("Symbology: " + result.CodeType);
        Console.WriteLine("-------------------------------");
    }
}

使用 C# 從 PDF 中提取和讀取條形碼

我們還可以使用 PdfExtractor 類識別嵌入在 PDF 頁面上的條形碼圖像。它允許從PDF中提取圖像,然後我們將從提取的圖像中讀取條碼信息。

我們可以按照以下步驟從提取的圖像中讀取條形碼:

  1. 首先,創建 PdfExtractor 類的實例。
  2. 接下來,使用 BindPdf() 方法綁定輸入的 PDF 文檔。
  3. 然後,設置圖像提取的頁面範圍。
  4. 接下來,調用 ExtractImage() 方法來提取圖像。
  5. 然後,將圖像保存到循環流中。
  6. 接下來,使用流對象創建 BarCodeReader 類的實例。
  7. 之後,調用 ReadBarCodes() 方法獲取 BarCodeResult 對象。
  8. 最後,顯示條碼信息。

下面的代碼示例展示瞭如何使用 C# 從 PDF 文檔中提取和讀取條形碼圖像。

// 下面的代碼示例展示瞭如何使用 PdfExtractor 將 PDF 頁面轉換為圖像並使用 C# 讀取條碼。
// 文檔的路徑
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 綁定 PDF 文檔
Aspose.Pdf.Facades.PdfExtractor pdfExtractor = new Aspose.Pdf.Facades.PdfExtractor();
pdfExtractor.BindPdf(file);

// 設置圖像提取的頁面範圍
pdfExtractor.StartPage = 1;
pdfExtractor.EndPage = 3;

// 提取圖像
pdfExtractor.ExtractImage();

// 將圖像保存到循環流中
while (pdfExtractor.HasNextImage())
{
  // 將圖像保存到流
  MemoryStream imageStream = new MemoryStream();
  pdfExtractor.GetNextImage(imageStream);
  imageStream.Position = 0;

  // 從上面的圖像流中識別條形碼
  BarCodeReader reader = new BarCodeReader(imageStream);
  foreach (BarCodeResult result in reader.ReadBarCodes())
  {
      Console.WriteLine("Codetext found: " + result.CodeText);
      Console.WriteLine("Symbology: " + result.CodeType);
      Console.WriteLine("-------------------------------");
  }
}

使用 C# 從 PDF 中查找和讀取條碼圖像

我們還可以使用 ImagePlacementAbsorber 類從 PDF 文檔中查找和提取條形碼圖像。它表示圖像放置對象的吸收器對象。它執行圖像使用搜索,並通過 ImagePlacements 集合提供對搜索結果的訪問。此方法有助於識別具有原始分辨率的條形碼。它可能無法正確識別矢量格式。

我們可以按照以下步驟從 PDF 文檔中查找和讀取條形碼:

  1. 首先,使用 Document 類加載 PDF 文檔。
  2. 接下來,創建 ImagePlacementAbsorber 類的一個實例。
  3. 然後,循環調用每個頁面的 Visit() 方法。
  4. 接下來,遍歷在 ImagePlacements 集合中找到的所有圖像。
  5. 然後,將圖像保存到內存流中。
  6. 接下來,使用流對象創建 BarCodeReader 類的實例。
  7. 之後,調用 ReadBarCodes() 方法獲取 BarCodeResult 對象。
  8. 最後,顯示條碼信息。

以下代碼示例展示瞭如何使用 C# 從 PDF 中查找和讀取條碼圖像。

// 此代碼示例演示如何使用 ImagePlacementAbsorber 從 PDF 文檔讀取條形碼。
// 文檔的路徑
string file = @"C:\Files\BarCode\sample-PDF-with-Barcodes.pdf";

// 加載 PDF 文檔
Aspose.Pdf.Document pdfDoc = new Aspose.Pdf.Document(file);

// 初始化 ImagePlacementAbsorber
Aspose.Pdf.ImagePlacementAbsorber imagePlacementAbsorber = new Aspose.Pdf.ImagePlacementAbsorber();

// 從第 1 頁開始處理文檔中的所有 PDF 頁面
for (int i = 1; i <= pdfDoc.Pages.Count; ++i)
{
    // 訪問頁面創建圖像提取器
    imagePlacementAbsorber.Visit(pdfDoc.Pages[i]);

    // 從 PDF 頁面中提取所有圖像
    foreach (Aspose.Pdf.ImagePlacement imagePlacement in imagePlacementAbsorber.ImagePlacements)
    {
        // 將圖像從 PDF 頁面轉換為流
        MemoryStream ms = new MemoryStream();
        imagePlacement.Save(ms, ImageFormat.Png);
        ms.Position = 0;

        // 從提取的頁面圖像中識別條形碼
        BarCodeReader reader = new BarCodeReader(ms);

        // 顯示結果
        foreach (BarCodeResult result in reader.ReadBarCodes())
        {
            Console.WriteLine("Codetext found: " + result.CodeText);
            Console.WriteLine("Symbology: " + result.CodeType);
            Console.WriteLine("-------------------------------");
        }
    }
}

獲得免費許可證

您可以 獲得免費的臨時許可證 來試用這些庫,而沒有評估限制。

結論

在本文中,我們學習瞭如何使用 C# 從 PDF 文檔中讀取條形碼。我們還看到了從 PDF 文檔中提取圖像並以編程方式解碼嵌入的條形碼的各種途徑和方法。此外,您可以使用 Aspose.BarCode 文檔Aspose.PDF 文檔 了解有關 API 的更多信息。如有任何疑問,請隨時在我們的 論壇 上與我們聯繫。

也可以看看