VB.NET 또는 C #에서 itextsharp dll로 PDF 콘텐츠 읽기


80

Pdfreader 클래스를 사용하여 itextsharp로 PDF 콘텐츠를 어떻게 읽을 수 있습니까? 내 PDF에는 일반 텍스트 또는 텍스트 이미지가 포함될 수 있습니다.


iTextSharp는 이제 github : link 에서 "iText 7 for .NET"또는 "itext7-dotnet"으로 불립니다 . 솔루션에 Nuget과 함께 itext7을 추가하는 것이 좋습니다.
Peter Huber

답변:


184
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System.IO;

public string ReadPdfFile(string fileName)
{
    StringBuilder text = new StringBuilder();

    if (File.Exists(fileName))
    {
        PdfReader pdfReader = new PdfReader(fileName);

        for (int page = 1; page <= pdfReader.NumberOfPages; page++)
        {
            ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
            string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

            currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
            text.Append(currentText);
        }
        pdfReader.Close();
    }
    return text.ToString();
}

16
이것은 솔루션으로 표시되어야합니다! 이것은 나를 위해 잘 작동합니다.
Carter Medlin 2011 년

1
특별한 이유는 pdfReader.Close (); for 루프 내에서 발생합니까?
Th 00 mÄ s nov.

8
.Close ()를 사용하지 않는 이유using (var pdfReader = ...) {}
Sebastian

2
또한 정적 방법 ASCIIEncoding.Convert이어야합니다Encoding.Convert
Sebastian

위 코드와 유사한 코드가 필요한 경우 C #에서 pdf 텍스트를 읽는 단계별 구현, 여기 링크가 있습니다. qawithexperts.com/article/c-sharp/… 감사합니다
user3559462

15

LGPL / FOSS iTextSharp 4.x

var pdfReader = new PdfReader(path); //other filestream etc
byte[] pageContent = _pdfReader .GetPageContent(pageNum); //not zero based
byte[] utf8 = Encoding.Convert(Encoding.Default, Encoding.UTF8, pageContent);
string textFromPage = Encoding.UTF8.GetString(utf8);

다른 답변은 나에게 유용하지 않았으며 모두 iTextSharp의 AGPL v5를 대상으로하는 것 같습니다. 나는에 대한 참조 찾을 수 없을 수 SimpleTextExtractionStrategy또는 LocationTextExtractionStrategyFOSS의 버전을.

이것과 관련하여 매우 유용한 다른 것 :

const string PdfTableFormat = @"\(.*\)Tj";
Regex PdfTableRegex = new Regex(PdfTableFormat, RegexOptions.Compiled);

List<string> ExtractPdfContent(string rawPdfContent)
{
    var matches = PdfTableRegex.Matches(rawPdfContent);

    var list = matches.Cast<Match>()
        .Select(m => m.Value
            .Substring(1) //remove leading (
            .Remove(m.Value.Length - 4) //remove trailing )Tj
            .Replace(@"\)", ")") //unencode parens
            .Replace(@"\(", "(")
            .Trim()
        )
        .ToList();
    return list;
}

표시된 텍스트가 Foo(bar)PDF에서로 인코딩되는 경우 PDF에서 텍스트 전용 데이터를 추출합니다 (Foo\(bar\))Tj.이 메서드는 Foo(bar)예상대로 반환 됩니다. 이 방법은 원시 pdf 콘텐츠에서 위치 좌표와 같은 많은 추가 정보를 제거합니다.


1
5.xx 텍스트 추출이 iText에 개념 증명으로 만 존재하고 iTextSharp에는 전혀 나타나지 않았습니다. 즉, 제시하는 코드는 매우 원시적으로 빌드 된 PDF에서만 작동합니다 (ASCII 인코딩 및 Tj 를 텍스트 그리기 연산자로만 사용하는 글꼴 사용 ). 매우 통제 된 환경 (이러한 원시 PDF 만 얻을 수 있음)에서는 사용할 수 있지만 일반적으로는 사용할 수 없습니다.
mkl 2014

올바른 Regex 표현식은 다음과 같습니다. (? <= () (. *?) (? =) Tj)
Diego

6

다음은 ShravankumarKumar의 솔루션을 기반으로하는 VB.NET 솔루션입니다.

이것은 당신에게 텍스트만을 줄 것입니다. 이미지는 다른 이야기입니다.

Public Shared Function GetTextFromPDF(PdfFileName As String) As String
    Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName)

    Dim sOut = ""

    For i = 1 To oReader.NumberOfPages
        Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy

        sOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
    Next

    Return sOut
End Function

내 PDF에서이 작업을 시도하면 "값은 null 일 수 없습니다. 매개 변수 이름 : 값"이라는 오류 메시지가 나타납니다. 이게 뭔지 아세요?
Avi

sOut & = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage (oReader, i, its). 또한이 오류에 대해 알아 냈습니다. 루프에서 꺼내 개별 페이지를 구문 분석하면 다른 페이지가 아닌 한 페이지에서 작동합니다. 내가 말할 수있는 유일한 차이점은 문제가있는 페이지에 이미지가 있다는 것입니다 (필요하지 않음).
Avi :

PDF를보고 싶으시면 보내드릴 수 있습니다.
Avi :

.Net 4.0 및 itextsharp 5.1.2.0 (방금 다운로드)을 사용하고 있습니다. 당신도 같은가요?
Carter Medlin 2011 년

.Net 3.5 및 itextsharp 5.1.1. 업데이트하여 해결되었는지 확인하겠습니다.
Avi :

5

제 경우에는 PDF 문서의 특정 영역에서 텍스트를 원했기 때문에 영역 주위에 사각형을 사용하고 텍스트를 추출했습니다. 아래 샘플에서 좌표는 전체 페이지에 대한 것입니다. 저는 PDF 저작 도구가 없기 때문에 사각형을 특정 위치로 좁힐 때가되었을 때 영역이 발견 될 때까지 좌표에서 몇 가지 추측을했습니다.

Rectangle _pdfRect = new Rectangle(0f, 0f, 612f, 792f); // Entire page - PDF coordinate system 0,0 is bottom left corner.  72 points / inch
RenderFilter _renderfilter = new RegionTextRenderFilter(_pdfRect);
ITextExtractionStrategy _strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), _filter);
string _text = PdfTextExtractor.GetTextFromPage(_pdfReader, 1, _strategy);

위의 주석에서 언급했듯이 결과 텍스트는 PDF 문서에서 찾은 서식을 유지하지 않지만 캐리지 리턴을 유지하는 것이 기뻤습니다. 제 경우에는 텍스트에 필요한 값을 추출 할 수있는 충분한 상수가있었습니다.


0

여기 ShravankumarKumar의 개선 된 답변입니다. 텍스트 행과 해당 행의 단어를 기반으로 pdf의 단어에 액세스 할 수 있도록 페이지에 대한 특수 클래스를 만들었습니다.

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;

//create a list of pdf pages
var pages = new List<PdfPage>();

//load the pdf into the reader. NOTE: path can also be replaced with a byte array
using (PdfReader reader = new PdfReader(path))
{
    //loop all the pages and extract the text
    for (int i = 1; i <= reader.NumberOfPages; i++)
    {
        pages.Add(new PdfPage()
        {
           content = PdfTextExtractor.GetTextFromPage(reader, i)
        });
    }
}

//use linq to create the rows and words by splitting on newline and space
pages.ForEach(x => x.rows = x.content.Split('\n').Select(y => 
    new PdfRow() { 
       content = y,
       words = y.Split(' ').ToList()
    }
).ToList());

커스텀 클래스

class PdfPage
{
    public string content { get; set; }
    public List<PdfRow> rows { get; set; }
}


class PdfRow
{
    public string content { get; set; }
    public List<string> words { get; set; }
}

이제 행과 단어 색인으로 단어를 얻을 수 있습니다.

string myWord = pages[0].rows[12].words[4];

또는 Linq를 사용하여 특정 단어가 포함 된 행을 찾습니다.

//find the rows in a specific page containing a word
var myRows = pages[0].rows.Where(x => x.words.Any(y => y == "myWord1")).ToList();

//find the rows in all pages containing a word
var myRows = pages.SelectMany(r => r.rows).Where(x => x.words.Any(y => y == "myWord2")).ToList();

-1
Public Sub PDFTxtToPdf(ByVal sTxtfile As String, ByVal sPDFSourcefile As String)
        Dim sr As StreamReader = New StreamReader(sTxtfile)
    Dim doc As New Document()
    PdfWriter.GetInstance(doc, New FileStream(sPDFSourcefile, FileMode.Create))
    doc.Open()
    doc.Add(New Paragraph(sr.ReadToEnd()))
    doc.Close()
End Sub

1
질문은 PDF 파일 읽기를 요청하는 것입니다. 답변은 하나를 만드는 것입니다!
AaA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.