c# text text-extraction pdfsharp

C#Extrae texto de PDF usando PdfSharp



text-extraction (3)

¿Existe la posibilidad de extraer texto sin formato de un archivo PDF con PdfSharp? No quiero usar iTextSharp debido a su licencia.


Lo he implementado de alguna manera similar a cómo lo hizo David. Aquí está mi código:

{ // .... var page = document.Pages[1]; CObject content = ContentReader.ReadContent(page); var extractedText = ExtractText(content); // ... } private IEnumerable<string> ExtractText(CObject cObject ) { var textList = new List<string>(); if (cObject is COperator) { var cOperator = cObject as COperator; if (cOperator.OpCode.Name== OpCodeName.Tj.ToString() || cOperator.OpCode.Name == OpCodeName.TJ.ToString()) { foreach (var cOperand in cOperator.Operands) { textList.AddRange(ExtractText(cOperand)); } } } else if (cObject is CSequence) { var cSequence = cObject as CSequence; foreach (var element in cSequence) { textList.AddRange(ExtractText(element)); } } else if (cObject is CString) { var cString = cObject as CString; textList.Add(cString.Value); } return textList; }


PDFSharp proporciona todas las herramientas para extraer el texto de un PDF. Use la clase ContentReader para acceder a los comandos dentro de cada página y extraiga las cadenas de los operadores TJ / Tj.

He subido una implementación simple a github .


Tomó la respuesta de Sergio e hizo algunos métodos de extensión. También cambié la acumulación de cadenas en un iterador.

public static class PdfSharpExtensions { public static IEnumerable<string> ExtractText(this PdfPage page) { var content = ContentReader.ReadContent(page); var text = content.ExtractText(); return text; } public static IEnumerable<string> ExtractText(this CObject cObject) { if (cObject is COperator) { var cOperator = cObject as COperator; if (cOperator.OpCode.Name== OpCodeName.Tj.ToString() || cOperator.OpCode.Name == OpCodeName.TJ.ToString()) { foreach (var cOperand in cOperator.Operands) foreach (var txt in ExtractText(cOperand)) yield return txt; } } else if (cObject is CSequence) { var cSequence = cObject as CSequence; foreach (var element in cSequence) foreach (var txt in ExtractText(element)) yield return txt; } else if (cObject is CString) { var cString = cObject as CString; yield return cString.Value; } } }