텍스트 PDF 추출

PDF 파일 형식은 다른 워드 프로세싱 파일 형식에 비해 파일 내용을 쉽게 수정할 수 없기 때문에 인기가 있습니다. 그러나 Aspose.PDF for .NET API를 사용하여 PDF 문서에서 텍스트를 추출할 수 있습니다. 이 기사에서는 C#을 사용하여 PDF 파일에서 텍스트를 검색하고 추출할 수 있는 여러 가능성 중 몇 가지를 살펴보겠습니다. 다음은 이 블로그에서 논의할 기능 목록입니다.

C#을 사용하여 전체 PDF 문서에서 텍스트 추출

PDF 문서에서 텍스트 내용을 읽는 것은 자주 사용되는 기능입니다. 아래 단계에 따라 문서의 모든 페이지에서 모든 텍스트를 추출할 수 있습니다.

  1. PDF 문서 로드
  2. TextAbsorber 객체 생성
  3. 모든 페이지에 대해 업소버를 수락합니다.
  4. 추출된 텍스트를 파일에 쓰고 저장

아래 코드 조각은 다음 단계를 따르고 C#을 사용하여 전체 PDF 문서에서 텍스트를 추출하는 방법을 보여줍니다.

// PDF 문서 열기
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 텍스트 추출을 위한 TextAbsorber 객체 생성
TextAbsorber textAbsorber = new TextAbsorber();
// 모든 페이지에 대해 업소버를 수락합니다.
pdfDocument.Pages.Accept(textAbsorber);
// 추출된 텍스트 가져오기
string extractedText = textAbsorber.Text;
// 작성기 생성 및 파일 열기
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 파일에 한 줄의 텍스트 쓰기
tw.WriteLine(extractedText);
// 스트림 닫기
tw.Close();

C#에서 PDF의 특정 페이지에서 텍스트 검색 및 추출

문서 수준에서 텍스트 추출을 살펴본 후 PDF 문서의 특정 페이지에서 텍스트를 추출해 보겠습니다. 요구 사항을 달성하려면 다음 단계를 따르십시오.

  1. PDF 문서 로드
  2. TextAbsorber 객체 생성
  3. 특정 페이지에 대한 흡수체 수락
  4. 추출된 텍스트를 파일에 쓰고 저장

다음 코드 조각은 다음 단계에 따라 C#을 사용하여 PDF 파일의 모든 페이지에서 텍스트를 읽습니다.

// PDF 문서 열기
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// PDF 문서의 필수 페이지에 액세스
Page page = pdfDocument.Pages[1];
// 텍스트 추출을 위한 TextAbsorber 객체 생성
TextAbsorber textAbsorber = new TextAbsorber();
// 지정된 페이지에 대한 흡수체를 수락하십시오.
page.Accept(textAbsorber);
// 추출된 텍스트 가져오기
string extractedText = textAbsorber.Text;
// 작성기 생성 및 파일 열기
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 파일에 한 줄의 텍스트 쓰기
tw.WriteLine(extractedText);
// 스트림 닫기
tw.Close();

C#에서 PDF 페이지의 특정 영역에서 텍스트 검색 및 추출

이 텍스트 추출을 한 단계 더 발전시켜 보겠습니다. 페이지의 특정 영역에서 일부 텍스트를 찾는 것이 좋습니다. 여기서 .NET용 Aspose.PDF의 기본 측정 단위는 72포인트가 1인치임을 이해하는 것이 중요합니다. 또한 왼쪽 하단 모서리는 페이지의 원점(0,0)으로 간주됩니다. 다음은 PDF 문서에서 페이지의 특정 영역 또는 섹션에서 텍스트를 읽는 단계입니다.

  1. 원본 PDF 문서 로드
  2. TextAbsorber 객체 생성
  3. TextSearchOptions 설정 및 직교좌표 지정
  4. 특정 페이지에 대한 흡수체를 수락하십시오.
  5. 추출된 텍스트를 파일에 쓰기

아래 코드 조각은 C#을 사용하여 특정 지역에서 텍스트를 추출하는 다음 단계를 보여줍니다.

// 문서 열기
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 텍스트 추출을 위한 TextAbsorber 객체 생성
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// 첫 페이지에 대한 흡수체를 수락하십시오.
pdfDocument.Pages[1].Accept(absorber);
// 추출된 텍스트 가져오기
string extractedText = absorber.Text;
// 작성기 생성 및 파일 열기
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 파일에 한 줄의 텍스트 쓰기
tw.WriteLine(extractedText);
// 스트림 닫기
tw.Close();

C#을 사용하여 정규 표현식을 사용하여 PDF 파일에서 특정 텍스트 검색 또는 추출

일부 패턴과 일치하는 PDF 문서에서 특정 텍스트를 추출할 수 있습니다. 예를 들어 특정 단어나 숫자를 추출할 수 있습니다. 이를 위해 정규식을 디자인해야 합니다. API는 해당 정규식을 활용하여 PDF 문서에서 일치하는 텍스트를 찾습니다. 다음 단계는 PDF 파일에서 특정 텍스트를 검색하고 추출하는 지침입니다.

  • 입력 PDF 문서 로드
  • TextAbsorber 객체 생성
  • 일부 텍스트와 일치하도록 정규식 디자인 및 설정
  • 추출된 각 텍스트 조각을 반복합니다.

다음 C# 코드 조각은 문서의 모든 페이지에서 4자리 숫자(예: 1999,2000 등)를 포함하는 텍스트를 검색하는 정규식을 사용합니다.

// 문서 열기
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// 입력 검색 구문의 모든 인스턴스를 찾기 위해 TextAbsorber 객체 생성
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;
// 모든 페이지에 대해 업소버를 수락합니다.
pdfDocument.Pages.Accept(textFragmentAbsorber);
// 추출된 텍스트 조각 가져오기
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// 조각을 통해 루프
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

C#을 사용하여 PDF 문서의 테이블 셀에서 텍스트 추출

PDF 페이지의 테이블에서 텍스트를 추출하는 것은 약간 다릅니다. 이전 예제에서 TextAbsorber 클래스로 작업했지만 테이블에서 텍스트를 추출하는 것은 약간 다릅니다. 따라서 Table 개체에서 텍스트를 추출하려면 다음 단계를 따라야 합니다.

  1. 소스 PDF 파일 로드
  2. TableAbsorber 클래스의 객체 생성
  3. AbsorbedTable을 통해 반복
  4. 테이블의 각 행에 있는 각 셀을 반복합니다.

아래 코드 조각은 다음 단계를 따르고 C#을 사용하여 PDF 문서의 테이블 셀에서 텍스트를 효율적으로 추출합니다.

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);
            }
        }
    }
}

C#을 사용하여 PDF 문서에서 강조 표시된 텍스트 검색 및 추출

강조 표시된 텍스트는 PDF 파일에 주석으로 표시됩니다. 여기에는 문서의 기존 텍스트와 다른 표시 텍스트가 포함되어 있습니다. 아래 단계에서는 C#을 사용하여 강조 표시된 텍스트를 읽는 방법을 설명합니다.

  1. 소스 문서 로드
  2. 모든 주석을 반복합니다.
  3. 필터 TextMarkupAnnotation
  4. 강조 표시된 텍스트 조각 검색

다음은 위의 단계를 기반으로 하는 코드 스니펫으로, PDF 파일에서 하이라이트 텍스트를 가져오는 데 사용할 수 있습니다.

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// 모든 주석을 반복합니다.
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // TextMarkupAnnotation 필터링
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // 강조 표시된 텍스트 조각 검색
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // 강조 표시된 텍스트 표시
            Console.WriteLine(tf.Text);
        }
    }
}

C#을 사용하여 메모리 사용량이 적은 PDF 텍스트 추출

다음은 C# 언어를 사용하여 PDF 문서에서 텍스트를 추출하는 동안 메모리 소비를 최적화하는 두 가지 다른 접근 방식입니다.

i) Reset() 및 FreeMemory() 메서드 사용

때때로 텍스트 추출은 엄청난 메모리와 프로세서를 소모할 수 있습니다. 입력 파일이 거대하고 많은 텍스트를 포함할 때 가능합니다. TextFragmentAbsorber 객체는 발견된 모든 텍스트 조각을 메모리에 저장하기 때문입니다.

따라서 여기서 권장하는 해결 방법은 각 페이지를 처리한 후 Absorber.Reset() 메서드를 호출하는 것입니다. 또한 읽기 작업만 수행하는 경우 page.FreeMemory() 메서드를 사용하여 페이지 개체가 보유하고 있는 메모리를 해제할 수도 있습니다. 따라서 최소한의 리소스를 활용하려면 다음 단계를 따라야 합니다.

  1. 원본 PDF 문서 로드
  2. TextEditOptions 지정
  3. [TextFragment] 읽기15
  4. Reset() 메서드 호출
  5. FreeMemory() 메서드 호출

다음 코드 조각은 C#을 사용하여 PDF 문서에서 텍스트 추출을 보여줍니다.

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);
    //조각에서 무언가 읽기
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.수집();        
}

450페이지, 24500개의 텍스트 조각, 많은 래스터 및 벡터 이미지가 포함된 거대한 샘플 파일로 이 코드 조각을 테스트했습니다. 이 프로세스는 500MB의 메모리만 사용했습니다. 또 다른 팁은 .NET 가비지 수집기를 청구하여 최대 메모리 소비를 약 250MB로 줄이고 처리 시간에 10초의 추가 비용을 들일 수 있다는 것입니다.

ii) MemorySaving 열거 사용

.NET API용 Aspose.PDF는 PDF 파일에서 텍스트를 읽는 동안 메모리 절약 모드 구성을 지원합니다. TextExtractionOptions.TextFormattingMode 열거형은 리소스를 최적으로 사용하기 위한 목적으로 사용됩니다. 다음 단계는 이 접근 방식에 따라야 할 단계를 요약한 것입니다.

  1. 소스 PDF 파일 로드
  2. TextDevice 객체 생성
  3. TextExtractionOptions 설정
  4. 텍스트 추출 및 파일에 텍스트 쓰기

아래 코드 스니펫은 C#을 사용한 메모리 절약 방식을 보여줍니다.

// 문서 열기
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// 추출된 텍스트를 저장할 문자열
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // 텍스트 장치 만들기
        TextDevice textDevice = new TextDevice();

        // 텍스트 추출 옵션 설정 - 텍스트 추출 모드 설정(Raw 또는 Pure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // 특정 페이지를 변환하고 스트림에 텍스트 저장
        textDevice.Process(pdfPage, textStream);
        // 특정 페이지를 변환하고 스트림에 텍스트 저장
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // 메모리 스트림 닫기
        textStream.Close();
        // 메모리 스트림에서 텍스트 가져오기
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// 추출된 텍스트를 텍스트 파일에 저장
File.WriteAllText(dataDir, builder.ToString());

결론

우리는 이 기사에서 많은 유용한 사용 사례 중 몇 가지를 탐구했으며, .NET API용 Aspose.PDF와 함께 C#을 사용하여 PDF 문서에서 텍스트를 추출할 수 있는 무한한 가능성이 있습니다. API 문서를 통해 자세히 알아볼 수 있습니다. 문의 사항이 있는 경우 무료 지원 포럼으로 문의해 주십시오.

또한보십시오