Trích xuất văn bản PDF csharp

Định dạng tệp PDF phổ biến vì nội dung tệp không thể sửa đổi dễ dàng so với các định dạng tệp xử lý văn bản khác. Tuy nhiên, trong C#, bạn có thể trích xuất văn bản từ tài liệu PDF bằng Aspose.PDF for .NET API. Trong bài viết này, chúng ta hãy khám phá một số khả năng tìm kiếm và trích xuất văn bản từ tệp PDF bằng C#. Sau đây là danh sách các tính năng chúng ta sẽ thảo luận trong blog này:

Trích xuất văn bản từ toàn bộ tài liệu PDF bằng C#

Đọc nội dung văn bản từ tài liệu PDF là một tính năng được sử dụng thường xuyên. Sử dụng C#, bạn có thể trích xuất tất cả văn bản từ tất cả các trang của tài liệu bằng cách thực hiện theo các bước dưới đây:

  1. Tải tài liệu PDF
  2. Tạo đối tượng TextAbsorber
  3. Chấp nhận chất hấp thụ cho tất cả các trang
  4. Viết văn bản trích xuất vào một tập tin và lưu nó

Đoạn mã dưới đây làm theo các bước sau và cho biết cách trích xuất văn bản từ toàn bộ tài liệu PDF bằng C#:

// Mở tài liệu PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Tạo đối tượng TextAbsorber để trích xuất văn bản
TextAbsorber textAbsorber = new TextAbsorber();
// Chấp nhận chất hấp thụ cho tất cả các trang
pdfDocument.Pages.Accept(textAbsorber);
// Lấy văn bản trích xuất
string extractedText = textAbsorber.Text;
// Tạo một nhà văn và mở tệp
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Viết một dòng văn bản vào tệp
tw.WriteLine(extractedText);
// Đóng luồng
tw.Close();

Tìm kiếm và trích xuất văn bản từ một trang cụ thể trong PDF bằng C#

Sau khi khám phá việc trích xuất văn bản ở cấp độ tài liệu, chúng ta hãy trích xuất văn bản từ một trang cụ thể của tài liệu PDF. Chỉ cần làm theo các bước dưới đây để đạt được yêu cầu của bạn:

  1. Tải tài liệu PDF
  2. Tạo đối tượng TextAbsorber
  3. Chấp nhận chất hấp thụ cho một trang cụ thể
  4. Viết văn bản trích xuất vào một tập tin và lưu nó

Đoạn mã sau làm theo các bước sau để đọc văn bản từ bất kỳ trang nào của tệp PDF bằng C#:

// Mở tài liệu PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Truy cập trang được yêu cầu trong tài liệu PDF
Page page = pdfDocument.Pages[1];
// Tạo đối tượng TextAbsorber để trích xuất văn bản
TextAbsorber textAbsorber = new TextAbsorber();
// Chấp nhận bộ hấp thụ cho trang được chỉ định
page.Accept(textAbsorber);
// Lấy văn bản trích xuất
string extractedText = textAbsorber.Text;
// Tạo một nhà văn và mở tệp
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Viết một dòng văn bản vào tệp
tw.WriteLine(extractedText);
// Đóng luồng
tw.Close();

Tìm kiếm và trích xuất văn bản từ vùng cụ thể của trang PDF trong C#

Hãy để chúng tôi thực hiện việc trích xuất văn bản này thêm một bước nữa. Xem xét việc tìm một số văn bản từ một khu vực cụ thể của trang. Điều quan trọng cần hiểu ở đây là đơn vị đo lường cơ bản trong Aspose.PDF for .NET là điểm, trong đó 72 điểm bằng 1 inch. Hơn nữa, góc dưới cùng bên trái được coi là điểm gốc (0,0) của trang. Sau đây là các bước để đọc văn bản từ một khu vực hoặc phần cụ thể của Trang trong tài liệu PDF:

  1. Tải tài liệu PDF nguồn
  2. Tạo đối tượng TextAbsorber
  3. Đặt TextSearchOptions và chỉ định tọa độ hình chữ nhật
  4. Chấp nhận chất hấp thụ cho trang cụ thể
  5. Viết văn bản trích xuất vào một tập tin

Đoạn mã dưới đây trình bày các bước này để trích xuất văn bản từ vùng cụ thể bằng C#:

// mở tài liệu
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Tạo đối tượng TextAbsorber để trích xuất văn bản
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Chấp nhận chất hấp thụ cho trang đầu tiên
pdfDocument.Pages[1].Accept(absorber);
// Lấy văn bản trích xuất
string extractedText = absorber.Text;
// Tạo một nhà văn và mở tệp
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Viết một dòng văn bản vào tệp
tw.WriteLine(extractedText);
// Đóng luồng
tw.Close();

Tìm kiếm hoặc Trích xuất Văn bản Cụ thể từ tệp PDF bằng Biểu thức Chính quy bằng C#

Bạn có thể trích xuất văn bản cụ thể từ tài liệu PDF phù hợp với một số mẫu. Chẳng hạn, bạn có thể muốn trích xuất một số từ hoặc số cụ thể. Với mục đích này, bạn sẽ cần thiết kế một biểu thức chính quy. API sẽ sử dụng biểu thức chính quy đó để tìm văn bản phù hợp trong tài liệu PDF. Dưới đây là các bước hướng dẫn tìm kiếm và trích xuất văn bản cụ thể từ tệp PDF:

  • Tải tài liệu PDF đầu vào
  • Tạo đối tượng TextAbsorber
  • Thiết kế và đặt biểu thức chính quy để khớp với một số văn bản
  • Lặp qua từng đoạn văn bản được trích xuất

Đoạn mã C# sau sử dụng biểu thức chính quy tìm kiếm văn bản chứa 4 chữ số, ví dụ: 1999,2000, v.v. trên tất cả các trang của tài liệu.

// mở tài liệu
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// tạo đối tượng TextAbsorber để tìm tất cả các phiên bản của cụm từ tìm kiếm đầu vào
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// chấp nhận chất hấp thụ cho tất cả các trang
pdfDocument.Pages.Accept(textFragmentAbsorber);
// lấy các đoạn văn bản được trích xuất
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// lặp qua các mảnh vỡ
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

Trích xuất văn bản từ các ô của bảng trong tài liệu PDF bằng C#

Trích xuất văn bản từ Bảng trên trang PDF hơi khác một chút. Chúng ta đã làm việc với lớp TextAbsorber trong các ví dụ trước, nhưng việc trích xuất văn bản từ Bảng thì hơi khác một chút. Do đó, bạn cần làm theo các bước dưới đây để trích xuất văn bản từ các đối tượng Bảng:

  1. Tải tệp PDF nguồn
  2. Tạo đối tượng của lớp TableAbsorber
  3. Lặp lại qua AbsorbedTable
  4. Lặp qua từng ô trong mỗi hàng của Bảng

Đoạn mã dưới đây làm theo các bước này và trích xuất hiệu quả văn bản từ các ô Bảng trong tài liệu PDF bằng C#:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Tìm kiếm & Trích xuất Văn bản được Đánh dấu từ Tài liệu PDF bằng C#

Văn bản được đánh dấu hiện dưới dạng Chú thích trong tệp PDF. Chúng chứa Văn bản được đánh dấu làm cho chúng khác với văn bản thông thường trong tài liệu. Các bước bên dưới mô tả cách đọc văn bản được đánh dấu bằng C#:

  1. Tải tài liệu nguồn
  2. Lặp qua tất cả các chú thích
  3. Lọc Chú thích đánh dấu văn bản
  4. Truy xuất các đoạn văn bản được đánh dấu

Sau đây là đoạn mã dựa trên các bước trên, nó có thể được sử dụng để lấy văn bản nổi bật từ tệp PDF:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Lặp qua tất cả các chú thích
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // Lọc TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Truy xuất các đoạn văn bản được đánh dấu
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Hiển thị văn bản được đánh dấu
            Console.WriteLine(tf.Text);
        }
    }
}

Trích xuất văn bản PDF với mức tiêu thụ bộ nhớ thấp bằng C#

Sau đây là hai cách tiếp cận khác nhau để tối ưu hóa mức tiêu thụ bộ nhớ trong khi trích xuất văn bản từ tài liệu PDF bằng ngôn ngữ C#.

i) Sử dụng phương thức Reset() và FreeMemory()

Đôi khi việc trích xuất văn bản có thể tiêu tốn rất nhiều bộ nhớ và bộ xử lý. Có thể khi tệp đầu vào lớn và chứa nhiều văn bản. Bởi vì đối tượng TextFragmentAbsorber lưu trữ tất cả các đoạn văn bản được tìm thấy trong bộ nhớ.

Do đó, giải pháp chúng tôi đề xuất ở đây là gọi phương thức hấp thụ.Reset() sau khi xử lý từng trang. Ngoài ra, nếu bạn chỉ thực hiện các thao tác đọc thì bạn cũng có thể giải phóng bộ nhớ do các đối tượng trang nắm giữ bằng phương thức page.FreeMemory(). Vì vậy, bạn cần làm theo các bước dưới đây để sử dụng các tài nguyên tối thiểu:

  1. Tải tài liệu PDF nguồn
  2. Chỉ định TextEditOptions
  3. Đọc Đoạn văn bản
  4. Gọi phương thức Reset()
  5. Gọi phương thức FreeMemory()

Đoạn mã sau minh họa trích xuất văn bản từ tài liệu PDF bằng C#:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Đọc một cái gì đó từ những mảnh vỡ
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

Chúng tôi đã thử nghiệm đoạn mã này với một tệp mẫu khổng lồ chứa 450 trang, 24500 đoạn văn bản và rất nhiều hình ảnh raster và vector. Quá trình tiêu thụ chỉ 500 MB bộ nhớ. Một mẹo khác ở đây là bạn có thể tính phí trình thu gom rác .NET để giảm mức tiêu thụ bộ nhớ tối đa xuống khoảng 250 MB với chi phí bổ sung là 10 giây thời gian xử lý.

ii) Sử dụng phép liệt kê MemorySaving

Aspose.PDF for .NET API hỗ trợ cấu hình chế độ tiết kiệm bộ nhớ trong khi đọc văn bản từ tệp PDF. Phép liệt kê TextExtractionOptions.TextFormattingMode phục vụ mục đích tiêu thụ tài nguyên tối ưu. Các bước sau đây tóm tắt các bước bạn cần thực hiện cho phương pháp này:

  1. Tải tệp PDF nguồn
  2. Tạo đối tượng TextDevice
  3. Đặt TextExtractionOptions
  4. Trích xuất văn bản và ghi văn bản vào một tập tin

Đoạn mã dưới đây minh họa cách tiếp cận tiết kiệm bộ nhớ bằng C#:

// mở tài liệu
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// Chuỗi để giữ văn bản trích xuất
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Tạo thiết bị văn bản
        TextDevice textDevice = new TextDevice();

        // Đặt tùy chọn trích xuất văn bản - đặt chế độ trích xuất văn bản (Thô hoặc Nguyên chất)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Chuyển đổi một trang cụ thể và lưu văn bản vào luồng
        textDevice.Process(pdfPage, textStream);
        // Chuyển đổi một trang cụ thể và lưu văn bản vào luồng
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Đóng luồng bộ nhớ
        textStream.Close();
        // Nhận văn bản từ dòng bộ nhớ
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Lưu văn bản trích xuất trong tệp văn bản
File.WriteAllText(dataDir, builder.ToString());

Sự kết luận

Chúng tôi đã khám phá một vài trong số nhiều trường hợp sử dụng hữu ích trong bài viết này, có vô số khả năng trích xuất văn bản từ tài liệu PDF bằng C# với Aspose.PDF for .NET API. Bạn có thể tìm hiểu thêm qua Tài liệu API. Trong trường hợp có bất kỳ thắc mắc nào, vui lòng liên hệ với chúng tôi tại Diễn đàn hỗ trợ miễn phí.

Xem thêm