Esiste la possibilità di estrarre testo semplice da un file PDF con PdfSharp? Non voglio usare iTextSharp a causa della sua licenza.C# Estrai il testo da PDF usando PdfSharp
Grazie per le vostre risposte.
EDIT: So che è possibile. Ma come faccio?
Esiste la possibilità di estrarre testo semplice da un file PDF con PdfSharp? Non voglio usare iTextSharp a causa della sua licenza.C# Estrai il testo da PDF usando PdfSharp
Grazie per le vostre risposte.
EDIT: So che è possibile. Ma come faccio?
PDFSharp fornisce tutti gli strumenti per estrarre il testo da un PDF. Utilizzare la classe ContentReader
per accedere ai comandi all'interno di ciascuna pagina ed estrarre le stringhe dagli operatori TJ/Tj.
Ho caricato un'implementazione semplice su github.
Su molti PDF CString.Value restituisce solo alcune cianfrusaglie (ad esempio, crea un PDF usando OpenOffice.org e prova ad importarlo usando questo metodo). –
L'ho implementato in qualche modo simile a come David l'ha fatto. Ecco il mio codice:
{
// ....
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;
}
Non dovresti aver smontato lo StringBuilder, i PDF sono abbastanza grandi e questa soluzione causerà un enorme consumo di memoria non necessario. –
Ha preso la risposta di Sergio e fatto alcuni metodi di estensione. Ho anche modificato l'accumulo di stringhe in un iteratore.
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;
}
}
}
Sto usando la libreria PDFsharp ma dice che ContentReader Class è fuori dal contesto. Qual è il problema? –
Classe ContentReader è fuori dal contesto. –
Non ho potuto resistere. IDK cosa significa o come risolverlo. Cerco di evitare di lavorare con PDF come la piaga perché gli strumenti per lavorare con loro sono schifo e fingere che un formato leggibile dall'uomo sia leggibile da un computer è una commissione totale. –
Basta chiedersi, perché downvotes? (Non ci sono commenti chiarificatori per aiutare l'autore a migliorare la domanda.) –