c# - tabla - itextsharp posicionar texto
Extracción de texto Itextsharp (3)
Estoy usando itextsharp en vb.net para obtener el contenido de texto de un archivo pdf. La solución funciona bien para algunos archivos, pero no para otros incluso bastante simples. El problema es que el valor de cadena del token se establece en nulo (un conjunto de cuadros cuadrados vacíos)
token = New iTextSharp.text.pdf.PRTokeniser(pageBytes)
While token.NextToken()
tknType = token.TokenType()
tknValue = token.StringValue
Puedo medir la longitud del contenido pero no puedo obtener el contenido real de la cadena.
Me di cuenta de que esto sucede dependiendo de la fuente del pdf. Si creo un pdf utilizando Acrobat o PdfCreator con Courier (que por cierto es la fuente predeterminada en mi editor de estudio visual) puedo obtener todo el contenido de texto. Si el mismo pdf está construido usando una fuente diferente, obtuve las cajas cuadradas vacías.
Ahora la pregunta es: ¿Cómo puedo extraer texto independientemente de la configuración de la fuente?
Gracias
Aquí hay una variante con iTextSharp.text.pdf.PdfName.ANNOTS y iTextSharp.text.pdf.PdfName.CONTENT si alguien lo necesita.
string strFile = @"C:/my/path/tothefile.pdf";
iTextSharp.text.pdf.PdfReader pdfRida = new iTextSharp.text.pdf.PdfReader(strFile);
iTextSharp.text.pdf.PRTokeniser prtTokeneiser;
int pageFrom = 1;
int pageTo = pdfRida.NumberOfPages;
iTextSharp.text.pdf.PRTokeniser.TokType tkntype ;
string tknValue;
for (int i = pageFrom; i <= pageTo; i++)
{
iTextSharp.text.pdf.PdfDictionary cpage = pdfRida.GetPageN(i);
iTextSharp.text.pdf.PdfArray cannots = cpage.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);
if(cannots!=null)
foreach (iTextSharp.text.pdf.PdfObject oAnnot in cannots.ArrayList)
{
iTextSharp.text.pdf.PdfDictionary cAnnotationDictironary = (iTextSharp.text.pdf.PdfDictionary)pdfRida.GetPdfObject(((iTextSharp.text.pdf.PRIndirectReference)oAnnot).Number);
iTextSharp.text.pdf.PdfObject moreshit = cAnnotationDictironary.Get(iTextSharp.text.pdf.PdfName.CONTENTS);
if (moreshit != null && moreshit.GetType() == typeof(iTextSharp.text.pdf.PdfString))
{
string cStringVal = ((iTextSharp.text.pdf.PdfString)moreshit).ToString();
if (cStringVal.ToUpper().Contains("LOS 8"))
{ // DO SOMETHING FUN
}
}
}
}
pdfRida.Close();
Complemento para la respuesta de Mark que me ayuda mucho. Los espacios de nombres y las clases de implementación de .iTextSharp son un poco diferentes de la versión de Java.
public static string GetTextFromAllPages(String pdfPath)
{
PdfReader reader = new PdfReader(pdfPath);
StringWriter output = new StringWriter();
for (int i = 1; i <= reader.NumberOfPages; i++)
output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));
return output.ToString();
}
Echa un vistazo a PdfTextExtractor .
String pageText =
PdfTextExtractor.getTextFromPage(myReader, pageNum);
o
String pageText =
PdfTextExtractor.getTextFromPage(myReader, pageNum, new LocationTextExtractionStrategy());
Ambos requieren versiones bastante recientes de iText [Sharp]. En realidad, analizar el flujo de contenido usted mismo simplemente está reinventando la rueda en este punto. Ahórrate un poco de dolor y deja que iText lo haga por ti.
PdfTextExtractor manejará todos los diferentes problemas de fuente / codificación para usted ... todos los que pueden manejarse de todos modos. Si no puede copiar / pegar con precisión desde Reader, entonces no hay suficiente información presente en el PDF para obtener información de caracteres de la secuencia de contenido.