Lea PDF usando itextsharp donde el idioma PDF no es inglés

Intento leer este PDF usando itextsharp en C #, que convertirá este pdf en archivo de palabras. también necesita mantener el formato de tabla y las fonts en word cuando bash con el pdf en inglés, funcionará perfectamente pero usando algunas de las lenguas indias como Hindi, Marathi no funciona.

public string ReadPdfFile(string Filename) { string strText = string.Empty; StringBuilder text = new StringBuilder(); try { PdfReader reader = new PdfReader((string)Filename); 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); text.Append(currentText); pdfReader.Close(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } textBox1.Text = text.ToString(); return text.ToString(); ; } 

Inspeccioné su archivo con un enfoque especial en su muestra “मतद | र” que se extrae como “मतदरर” en la línea superior de las páginas del documento.

En una palabra:

Su documento en sí proporciona la información de que, por ejemplo, los glifos “मतद | र” en la línea de encabezado representan el texto “मतदरर”. Debe solicitar al origen de su documento una versión de documento en la que la información de fuente no sea engañosa. Si eso no es posible, debe optar por OCR.

En detalle:

La línea superior de la primera página se genera mediante las siguientes operaciones en la secuencia de contenido de la página:

 /9 280 Tf (-12"!%$"234%56*5) Tj 

La primera línea selecciona la fuente llamada / 9 a un tamaño de 280 (una operación al principio de la página lo escala por un factor de 0.05, por lo tanto, el tamaño efectivo es 14 unidades que usted observa en el archivo).

La segunda línea causa que se impriman glifos. Estos glifos se referencian entre los corchetes utilizando la encoding personalizada de esa fuente.

Cuando un progtwig intenta extraer el texto, debe deducir los caracteres reales de estas referencias de glifos usando información de la fuente.

La fuente / 9 en la primera página de su PDF se define utilizando estos objetos:

 242 0 obj< < /Type/Font/Name/9/BaseFont 243 0 R/FirstChar 33/LastChar 94 /Subtype/TrueType/ToUnicode 244 0 R/FontDescriptor 247 0 R/Widths 248 0 R>> endobj 243 0 obj/CDAC-GISTSurekh-Bold+0 endobj 247 0 obj< < /Type/FontDescriptor/FontFile2 245 0 R/FontBBox 246 0 R/FontName 243 0 R /Flags 4/MissingWidth 946/StemV 0/StemH 0/CapHeight 500/XHeight 0 /Ascent 1050/Descent -400/Leading 0/MaxWidth 1892/AvgWidth 946/ItalicAngle 0>> endobj 

Entonces no hay elemento / Codificación pero al menos hay una referencia a un mapa / ToUnicode . Por lo tanto, un progtwig que extrae texto debe confiar en la asignación dada / ToUnicode .

La secuencia a la que hace referencia / ToUnicode contiene las siguientes asignaciones de interés al extraer el texto de (-12 “!% $” 234% 56 * 5):

 <21> <21> <0930> <22> <22> <0930> <24> <24> <091c> <25> <25> <0020> <2a> <2a> <0031> <2d> <2d> <092e> <31> <31> <0924> <32> <32> <0926> <33> <33> <0926> <34> <34> <002c> <35> <35> <0032> <36> <36> <0030> 

(Ya aquí puede ver que los códigos de múltiples caracteres están asignados al mismo punto de código Unicode …)

Por lo tanto, la extracción de texto debe dar como resultado:

 - = 0x2d -> 0x092e = म 1 = 0x31 -> 0x0924 = त 2 = 0x32 -> 0x0926 = द " = 0x22 -> 0x0930 = र instead of | ! = 0x21 -> 0x0930 = र % = 0x25 -> 0x0020 = $ = 0x24 -> 0x091c = ज " = 0x22 -> 0x0930 = र 2 = 0x32 -> 0x0926 = द 3 = 0x33 -> 0x0926 = द 4 = 0x34 -> 0x002c = , % = 0x25 -> 0x0020 = 5 = 0x35 -> 0x0032 = 2 6 = 0x36 -> 0x0030 = 0 * = 0x2a -> 0x0031 = 1 5 = 0x35 -> 0x0032 = 2 

Por lo tanto, el texto que iTextSharp (y también Adobe Reader!) Extrae del encabezado en la primera página del documento es exactamente lo que el documento en su fuente informa es correcto.

Como la causa de esto es la información de mapeo engañosa en la definición de fuente, no es sorprendente que haya interpretaciones erróneas en todo el documento.

Como dijo @mkl, necesitaremos más información sobre por qué las cosas no funcionan. Pero puedo decirte un par de cosas que pueden ayudarte.

Primero, SimpleTextExtractionStrategy es muy simple . Si lees los documentos , verás que:

Si el PDF representa el texto de una manera que no sea de arriba hacia abajo, el texto no será una representación real de cómo aparece en el PDF

Lo que eso significa es que, aunque parezca que un PDF debe leerse de arriba a abajo, puede haber sido escrito en un orden diferente. El PDF al que hizo referencia en realidad tiene la segunda línea visual escrita primero. Ver mi publicación aquí para una estrategia de extracción de texto un poco más inteligente que intenta devolver el texto de arriba a abajo. Cuando ejecuto mi código contra la primera página de su PDF, parece que saca cada “línea” correctamente.

En segundo lugar, los archivos PDF no tienen un concepto de tablas. Solo tienen texto y líneas dibujadas en ciertos lugares y ninguno de estos está relacionado entre sí. Lo que eso significa es que necesitaría calcular cada línea y construir su propio concepto de una tabla, no encontrará ningún código dentro de iTextSharp que haga esto por usted. Personalmente, ni siquiera me molestaría en intentar escribir uno.

En tercer lugar, la extracción de texto es para extraer texto que no tiene nada que ver con las fonts. Si quieres eso, tendrás que construir esa lógica en ti mismo. Ver mi publicación aquí para un comienzo muy básico.