2017-02-06 1 views
0

En utilisant iTextSharp, je suis en train d'extraire le texte à partir du fichier PDF suivant:iTextSharp insérant des espaces dans les mots d'un fichier pdf

https://www.treasury.gov/ofac/downloads/sdnlist.pdf

Voici le code:

var currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 2, new SimpleTextExtractionStrategy()); 
        if (currentText.Length > 0) 
          { 
           var capture = new Capture(); 
           capture.Text = currentText; 

           // write the results to the DB, if any data was found 
           _dataService.AddCapture(capture); 
          } 

aide SimpleTextExtractionStrategy, les résultats sont écrits dans la base de données avec des myriades d'espaces indésirables dans les mots. Les premières lignes de la page 2 écriture comme:

BUREAU DE L'ACTIF ÉTRANGERS DE CONTRÔLE Specially Designated RESSORTISSANTS & BLOQUE Personnes 3 Février, 2017-2 - A.A. RASPLET DANS; un .k. a. AL MAZ -AN TEY MSDB; alias . AL MAZ -ANTEY PV O 'AI R DÉFENSE' CO NCERN SYSTÈME DE CONCEPTION S BUREAU DE CONCEPTION OAO 'OPEN JO INT -STOCK SOCIÉTÉ IMENI ACADEMIC IAN A.A. RASPLETIN; alias. GO LOVNOYE SISTEMN OYE KONS TRUKT ORSKOY E BYURO OUVERT J OIN T-S TOCK C OMP ANY DE ALMAZ -AN TEY PVO C ONCERN I MEN I ACADÉMICIEN A .A. TIN ROULEAU; a.k. une. JO INT EN STOCK C OMPANY A LMA Z-AN TEY AI R DÉFENSE CON CERN MA IN SYSTÈME M DESIGN BUREAU NOMMÉ PAR ACADE MICIAN A.A.

Voir par exemple le mot « JO INT » dans les 4e & 6e lignes, et le mot « CON CERN » dans la 2ème dernière ligne. Ces types d'espaces se produisent dans l'ensemble des résultats. Cela rendra impossible l'interrogation du texte, malheureusement.

Est-ce que quelqu'un a une idée de ce que cela fait et comment résoudre ce problème?

Répondre

1

pourquoi cela ne présente

La cause est en fait une caractéristique de la stratégie d'extraction de texte dans votre cas ne fonctionne pas comme on le souhaite.

Un peu d'histoire: Ce que vous percevez comme un espace entre les mots dans un fichier PDF ne vient pas nécessairement être en raison d'une instruction dessin un espace, il peut aussi être le résultat d'une instruction déplacement de la position d'insertion de texte un peu à droite. Ainsi, les stratégies d'extraction de texte ajoutent généralement un caractère espace lorsque vous trouvez un décalage de droite suffisamment grand comme ça. Pour d'autres sur ce sujet (en particulier la partie "suffisamment grande"), par exemple. this answer.

Dans le cas de votre document, cependant, la police du corps du texte a trop peu d'informations sur la largeur de police (si elle est utilisée telle quelle, les caractères apparaissent collés sans espace entre les deux); ainsi, il existe de petits décalages à droite entre chaque couple de caractères consécutifs, certains de ces décalages étant suffisamment larges pour être faussement identifiés comme des séparations de mots par le mécanisme expliqué ci-dessus.

comment résoudre ce

Comme séparations de mots dans votre PDF sont créés par des instructions de dessin un espace, vous n'avez pas besoin de la fonction expliquée ci-dessus. Ainsi, le moyen le plus simple de résoudre le problème consiste à utiliser une stratégie d'extraction de texte sans cette fonctionnalité.

Vous pouvez créer une telle stratégie en copiant le code source du SimpleTextExtractionStrategy (par ex.de here) et de commenter quelques lignes de la méthode RenderText comme ci-dessous:

public virtual void RenderText(TextRenderInfo renderInfo) 
{ 
    [...] 

    if (hardReturn) 
    { 
     //System.out.Println("<< Hard Return >>"); 
     AppendTextChunk('\n'); 
    } 
    else if (!firstRender) 
    { 
//  if (result[result.Length - 1] != ' ' && renderInfo.GetText().Length > 0 && renderInfo.GetText()[0] != ' ') 
//  { // we only insert a blank space if the trailing character of the previous string wasn't a space, and the leading character of the current string isn't a space 
//   float spacing = lastEnd.Subtract(start).Length; 
//   if (spacing > renderInfo.GetSingleSpaceWidth()/2f) 
//   { 
//    AppendTextChunk(' '); 
//    //System.out.Println("Inserting implied space before '" + renderInfo.GetText() + "'"); 
//   } 
//  } 
    } 
    else 
    { 
     //System.out.Println("Displaying first string of content '" + text + "' :: x1 = " + x1); 
    } 

    [...] 
} 

En utilisant cette stratégie simplifiée d'extraction, votre texte est correctement extrait.

+0

Je vous ai vu autour de ces parties et vous êtes certainement le roi de ce sujet. Merci pour votre grande sagesse et votre aide! – Stpete111