¿Cómo puedo leer el contenido del PDF con itextsharp con el Pdfreader clase. Mi PDF pueden incluir texto o Imágenes del texto.

InformationsquelleAutor user221185 | 2010-03-31

6 Comentarios

  1. 175
    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();
    }
    • Este debe ser marcada como la solución! Esto funciona muy bien para mí.
    • De acuerdo, esto funciona, marca como la respuesta.
    • Funciona perfectamente, gracias un montón!
    • gracias por esa muestra
    • Alguna razón en particular la pdfReader.Close(); sucede dentro del bucle?
    • La misma pregunta – ¿por qué el cierre de reader dentro del bucle?
    • ¿por qué usar .Close() a todos y no using (var pdfReader = ...) {}
    • También, ASCIIEncoding.Convert debe ser Encoding.Convert ya que es un método estático

  2. 19

    Usted no puede leer y analizar el contenido de un PDF con iTextSharp como le gustaría.

    De iTextSharp del SourceForge tutorial:

    No puede ‘analizar’ un archivo PDF existente
    el uso de iText, sólo puede ‘leer’ se
    página por página.

    ¿Qué significa esto?

    El formato pdf es sólo un lienzo donde
    el texto y los gráficos se colocan sin
    cualquier información de la estructura. Como tal
    no hay ningún ‘iText-de los objetos en un
    Archivo PDF. En cada página hay
    probablemente un número de ‘Cuerdas’, pero
    no se puede reconstruir una frase o un
    párrafo con estas cadenas. Allí
    son, probablemente, un número de líneas dibujadas,
    pero usted no puede recuperar una Tabla-objeto
    basado en estas líneas. En resumen:
    analizando el contenido de un archivo PDF es
    NO es POSIBLE con iText. Publica tu
    pregunta en el grupo de noticias
    news://comp.texto.pdf y tal vez
    va a obtener algunas respuestas de las personas que
    se han creado herramientas que puede analizar PDF
    y el extracto de algunos de sus contenidos, pero
    no espere que las herramientas que se llevará a cabo un
    a prueba de balas conversión estructurado
    texto.

    • +1 Gracias por el fragmento del tutorial. Es el más simple pieza informativa de aclaración (la revelación, la verdad) que he visto acerca de los archivos PDF. Antes de leerlo, yo solía pensar que hay algún tipo de Palabra-como la estructura que presente dentro de los archivos PDF.
    • Me alegro de poder ayudar!
  3. 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);

    Ninguna de las otras respuestas fueron de utilidad para mí, todos ellos parece que se dirigen a la AGPL v5 de iTextSharp. Nunca pude encontrar ninguna referencia a SimpleTextExtractionStrategy o LocationTextExtractionStrategy en el software libre versión.

    Algo más que podría ser muy útil en combinación con este:

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

    Esto extraerá el texto sólo los datos de los PDF, si el texto que se muestra es Foo(bar) será codificada en el archivo PDF como (Foo\(bar\))Tj, este método devuelve Foo(bar) como se esperaba. Este método se tira un montón de información adicional, tales como las coordenadas de ubicación de la cruda contenido del pdf.

    • Tienes razón, antes de las 5.x.x la extracción del texto estuvo presente en iText simplemente como prueba-de-concepto y en iTextSharp no en todos. Dicho esto, el código de la actualidad sólo funciona en muy primitivamente construido Pdf (uso de fuentes con un ASCII ish codificación y Tj como sólo texto dibujo operador). Puede ser utilizable en ambientes muy controlados (en la que puede garantizar a tan primitivo Pdf), pero no en general.
  4. 6

    Aquí es un VB.NET solución basada en ShravankumarKumar la solución.

    Esto le dará SÓLO el texto. Las imágenes son una historia diferente.

    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
    • Cuando yo intente esto en mi PDF, me da el mensaje de error «el Valor no puede ser nulo. Nombre de parámetro: valor». Alguna idea de qué se trata?
    • ¿Me puede decir qué línea de código te da ese error?
    • sOut &= iTextSharp.texto.pdf.analizador.PdfTextExtractor.GetTextFromPage(oReader, yo, su). También, me imaginé algo acerca de este error. Si me lo saco del bucle y analizar cada una de las páginas, funciona en una página y no en el otro. La única diferencia entre los dos que te puedo decir es que el problema de la página tiene las imágenes en ella (que no necesito).
    • Si quieres tener una mirada en el PDF, que puede enviar a usted.
    • Estoy usando .Net 4.0 y itextsharp 5.1.2.0 (descargado). Mismo con usted?
    • .Net 3.5 y itextsharp 5.1.1. Voy a actualizar y ver si se ha solucionado.
    • actualizado a 5.1.2 y el error se ha ido! gracias!
    • Dulce! Encantados de ayudarle.

  5. 5

    En mi caso, yo sólo quería que el texto de un área específica de un documento en PDF por lo que utiliza un rectángulo alrededor del área y extrae el texto de la misma. En el ejemplo a continuación las coordenadas son para toda la página. No tengo PDF herramientas de creación así que cuando llegó el momento de reducir el rectángulo a la ubicación específica tomé un par de conjeturas en las coordenadas hasta que la zona fue encontrado.

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

    Como se nota por los comentarios anteriores de que el texto resultante no mantener ninguna de formato que se encuentra en el documento PDF, sin embargo estaba feliz de que lo hizo preservar los retornos de carro. En mi caso no fueron lo suficientemente constantes en el texto que yo era capaz de extraer los valores que yo necesitaba.

  6. 0
    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
    • La pregunta está pidiendo para leer un archivo PDF, su respuesta es la creación de uno!

Dejar respuesta

Please enter your comment!
Please enter your name here