VB.NET या C # में itextsharp dll के साथ पीडीएफ सामग्री पढ़ना


80

मैं पीडीएफ सामग्री को Pdfreader वर्ग के साथ itextsharp के साथ कैसे पढ़ सकता हूं। मेरे PDF में सादा पाठ या पाठ की छवियाँ शामिल हो सकती हैं।


iTextSharp को अब github पर "iText 7 for .NET" या "itext7-dotnet" कहा जाता है: लिंक । यह अपने समाधान के लिए Nuget के साथ itext7 जोड़ने की सिफारिश की है।
पीटर

जवाबों:


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
इसे समाधान के रूप में चिह्नित किया जाना चाहिए! यह मेरे लिए बहुत अच्छा काम करता है।
कार्टर मेडलिन

1
किसी विशेष कारण से pdfReader.Close (); लूप के लिए अंदर होता है?
गु 00 वर्ग मीटर

8
क्यों इस्तेमाल कर रहे हैं। क्लोज () बिल्कुल नहीं औरusing (var pdfReader = ...) {}
सेबेस्टियन

2
इसके अलावा, जैसा कि यह एक स्थिर तरीका ASCIIEncoding.Convertहोना चाहिएEncoding.Convert
सेबस्टियन

अगर किसी को कोड के ऊपर एक समान कोड की आवश्यकता है, तो सी # में पीडीएफ के पाठ को पढ़ने के लिए कदम से कदम कार्यान्वयन, यहां लिंक है, 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)इसे पीडीएफ में एन्कोड किया जाएगा (Foo\(bar\))Tj, यह विधि Foo(bar)अपेक्षित रूप से वापस आ जाएगी । यह विधि बहुत सारी अतिरिक्त सूचनाओं को छीन लेगी जैसे कि कच्चे पीडीएफ़ सामग्री से स्थान निर्देशांक।


1
आप सही हैं, इससे पहले 5.xx पाठ निष्कर्षण iText में केवल सबूत-की-अवधारणा के रूप में मौजूद था और iTextSharp में बिल्कुल भी नहीं। कहा जा रहा है कि, आपके द्वारा प्रस्तुत कोड केवल बहुत ही प्राथमिक रूप से निर्मित PDF ( केवल ASCII'ish एन्कोडिंग और केवल टेक्स्ट ड्रॉइंग ऑपरेटर के रूप में Tj के साथ फ़ॉन्ट का उपयोग करके ) काम करता है। यह बहुत ही नियंत्रित वातावरण में प्रयोग करने योग्य हो सकता है (जिसमें आप केवल इस तरह के आदिम पीडीएफ प्राप्त करना सुनिश्चित कर सकते हैं) लेकिन सामान्य रूप से नहीं।
mkl

सही रेगेक्स अभिव्यक्ति है: (? <? () (? *।?) (? =) टीजे)
डिएगो

6

यहाँ श्रवणकुमारकुमार के समाधान पर आधारित एक 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

जब मैं अपने पीडीएफ पर यह कोशिश करता हूं, तो यह मुझे त्रुटि संदेश देता है, "मान शून्य नहीं हो सकता। पैरामीटर नाम: मान"। किसी भी विचार यह क्या है?
अवि।

sOut & = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage (oReader, i, its)। इसके अलावा, मुझे इस त्रुटि के बारे में कुछ पता चला। यदि मैं इसे लूप से बाहर निकालता हूं और व्यक्तिगत पृष्ठों को पार्स करता हूं, तो यह एक पृष्ठ पर काम करता है, दूसरे पर नहीं। दोनों के बीच एकमात्र अंतर जो मैं बता सकता हूं कि समस्याग्रस्त पृष्ठ पर इस पर चित्र हैं (जिनकी मुझे आवश्यकता नहीं है)।
एवी

यदि आप पीडीएफ को देखना चाहते हैं, तो मैं आपको भेज सकता हूं।
एवी

मैं .net 4.0 और itextsharp 5.1.2.0 (बस डाउनलोड किया गया) का उपयोग कर रहा हूं। आप के साथ भी?
कार्टर मेडलिन

.Net 3.5 और itextsharp 5.1.1। मैं अपडेट करूंगा और देखूंगा कि क्या यह हल हो गया है।
अवी।

5

मेरे मामले में, मुझे बस पीडीएफ दस्तावेज़ के एक विशिष्ट क्षेत्र से पाठ चाहिए था, इसलिए मैंने क्षेत्र के चारों ओर एक आयत का उपयोग किया और इसके साथ पाठ को निकाला। नीचे दिए गए नमूने में निर्देशांक पूरे पृष्ठ के लिए हैं। मेरे पास पीडीएफ संलेखन उपकरण नहीं है, इसलिए जब आयत को उस विशिष्ट स्थान पर संकीर्ण करने का समय आया तो मैंने निर्देशांक में कुछ अनुमान लगाए, जब तक कि क्षेत्र नहीं मिला।

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

उपरोक्त टिप्पणियों के अनुसार, परिणामी पाठ पीडीएफ दस्तावेज़ में पाए गए किसी भी स्वरूपण को बनाए नहीं रखता है, हालांकि, मुझे खुशी है कि इसने गाड़ी के रिटर्न को संरक्षित किया। मेरे मामले में, पाठ में पर्याप्त स्थिरांक थे जो मुझे उन मूल्यों को निकालने में सक्षम थे जो मुझे आवश्यक थे।


0

यहाँ श्रवणकुमारकुमार का बेहतर उत्तर है। मैंने पृष्ठों के लिए विशेष कक्षाएं बनाईं ताकि आप पाठ पंक्तियों और उस पंक्ति के शब्द के आधार पर पीडीएफ में शब्दों तक पहुंच सकें।

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
प्रश्न पीडीएफ फाइल को पढ़ने के लिए कह रहा है, आपका उत्तर एक बना रहा है!
एएए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.