2011-06-09 5 views
6

Je construis actuellement une application de .NET et une de l'exigence est qu'elle doit convertir un dossier de pdf en dossier de XML. Quelqu'un at-il eu du succès en faisant cela? Si oui, qu'avez-vous utilisé?conversion de pdf en xml using. NET

+1

Quel type de pdf essayez-vous de "convertir"? Les fichiers PDF ne sont pas "structurés", donc en général, il est difficile d'en extraire des informations.Je pense que vous devriez donner plus de détails sur ce que vous essayez d'accomplir. – yms

Répondre

2

Vous pouvez utiliser une bibliothèque pdf telle que iTextSharp pour interroger votre fichier pdf. Une fois que vous avez accédé aux données dont vous avez besoin, vous pouvez facilement créer un fichier XML. Il y a une tonne d'info sur le web sur la façon de créer un fichier xml avec C# et d'autres langages .net. Si vous avez une question spécifique, il suffit de demander ;-)

5

J'ai fait ce genre de projet plusieurs fois auparavant.

Les choses que vous devez faire:

1.) Vérifiez ce projet Extract Text from PDF in C#. Le projet utilise ITextSharp.

  • Il serait préférable que vous téléchargiez l'exemple de projet et que vous voyiez comment cela fonctionne. Dans ce projet, il montre comment extraire des données à partir d'un pdf. Découvrez la classe PDFParser, il a la fonction nommée ExtractTextFromPDFBytes (octet [] entrée) de cette fonction, vous pouvez voir comment le texte est extrait à partir du fichier pdf non compressé. N'oubliez pas d'inclure la DLL ITextSharp.

classe PDFParser

 
    1 using System; 
    2 using System.IO; 
    3 using iTextSharp.text.pdf; 
    4 
    5 namespace PdfToText 
    6 { 
    7  /// 
    8  /// Parses a PDF file and extracts the text from it. 
    9  /// 
10  public class PDFParser 
11  { 
12   /// BT = Beginning of a text object operator 
13   /// ET = End of a text object operator 
14   /// Td move to the start of next line 
15   /// 5 Ts = superscript 
16   /// -5 Ts = subscript 
17 
18   #region Fields 
19 
20   #region _numberOfCharsToKeep 
21   /// 
22   /// The number of characters to keep, when extracting text. 
23   /// 
24   private static int _numberOfCharsToKeep = 15; 
25   #endregion 
26 
27   #endregion 
28 
29   #region ExtractText 
30   /// 
31   /// Extracts a text from a PDF file. 
32   /// 
33   /// the full path to the pdf file. 
34   /// the output file name. 
35   /// the extracted text 
36   public bool ExtractText(string inFileName, string outFileName) 
37   { 
38    StreamWriter outFile = null; 
39    try 
40    { 
41     // Create a reader for the given PDF file 
42     PdfReader reader = new PdfReader(inFileName); 
43     //outFile = File.CreateText(outFileName); 
44     outFile = new StreamWriter(outFileName, false, System.Text.Encoding.UTF8); 
45     
46     Console.Write("Processing: "); 
47     
48     int  totalLen = 68; 
49     float charUnit = ((float)totalLen)/(float)reader.NumberOfPages; 
50     int  totalWritten= 0; 
51     float curUnit  = 0; 
52 
53     for (int page = 1; page = 1.0f) 
59      { 
60       for (int i = 0; i = 1.0f) 
70       { 
71        for (int i = 0; i 
104   /// This method processes an uncompressed Adobe (text) object 
105   /// and extracts text. 
106   /// 
107   /// uncompressed 
108   /// 
109   private string ExtractTextFromPDFBytes(byte[] input) 
110   { 
111    if (input == null || input.Length == 0) return ""; 
112 
113    try 
114    { 
115     string resultString = ""; 
116 
117     // Flag showing if we are we currently inside a text object 
118     bool inTextObject = false; 
119 
120     // Flag showing if the next character is literal 
121     // e.g. '\\' to get a '\' character or '\(' to get '(' 
122     bool nextLiteral = false; 
123 
124     //() Bracket nesting level. Text appears inside() 
125     int bracketDepth = 0; 
126 
127     // Keep previous chars to get extract numbers etc.: 
128     char[] previousCharacters = new char[_numberOfCharsToKeep]; 
129     for (int j = 0; j = ' ') && (c = 128) && (c 
235   /// Check if a certain 2 character token just came along (e.g. BT) 
236   /// 
237   /// the searched token 
238   /// the recent character array 
239   /// 
240   private bool CheckToken(string[] tokens, char[] recent) 
241   { 
242    foreach(string token in tokens) 
243    { 
244     if ((recent[_numberOfCharsToKeep - 3] == token[0]) && 
245      (recent[_numberOfCharsToKeep - 2] == token[1]) && 
246      ((recent[_numberOfCharsToKeep - 1] == ' ') || 
247      (recent[_numberOfCharsToKeep - 1] == 0x0d) || 
248      (recent[_numberOfCharsToKeep - 1] == 0x0a)) && 
249      ((recent[_numberOfCharsToKeep - 4] == ' ') || 
250      (recent[_numberOfCharsToKeep - 4] == 0x0d) || 
251      (recent[_numberOfCharsToKeep - 4] == 0x0a)) 
252      ) 
253     { 
254      return true; 
255     } 
256    } 
257    return false; 
258   } 
259   #endregion 
260  } 
261 } 

2.) Parse le texte extrait et de créer et le fichier xml.

  • Certains de mes soucis avant sont les pdf qui contiennent des liens cassés ou des URLs à l'intérieur des pages. Maintenant, juste au cas où vous êtes également préoccupé par cette question, l'expression régulière peut facilement résoudre votre problème, mais je vous suggère de traiter plus tard.

  • Maintenant, voici un exemple de code sur la façon de créer un fichier XML. Comprenez comment le code fonctionne plus tard, vous saurez comment gérer votre propre code.

 
    try { 
     //XmlDataDocument sourceXML = new XmlDataDocument(); 
     string xmlFile = Server.MapPath(“DVDlist.xml”); 
     //create a XML file is not exist 
     System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(xmlFile, null); 
     //starts a new document 
     writer.WriteStartDocument(); 
     //write comments 
     writer.WriteComment(“Commentss: XmlWriter Test Program”); 
     writer.Formatting = Formatting.Indented; 
     writer.WriteStartElement(“DVDlist”); 
     writer.WriteStartElement(“DVD”); 
     writer.WriteAttributeString(“ID”, “1″); 
     //write some simple elements 
     writer.WriteElementString(“Title”, “Tere Naam”); 
     writer.WriteStartElement(“Starring”); 
     writer.WriteElementString(“Actor”, “Salman Khan”); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
     writer.Close(); 
    } 
    catch (Exception e1) { 
     Page.Response.Write(e1); 
    } 

Hope it helps :)

0

Jetez un coup d'œil à pdf2Data.
http://itextpdf.com/blog/pdf2data-extract-information-invoices-and-templates

Il convertit les fichiers PDF en fichiers XML basés sur un modèle. Les modèles sont définis en utilisant des sélecteurs qui permettent à l'utilisateur final de spécifier des choses comme «sélectionner le tableau sur la 2ème page» ou «sélectionner le texte écrit dans cette police particulière» et ainsi de suite. N'oubliez pas, je suis affilié à iText, même si ma connaissance du PDF est vaste, je peux être considéré comme parti pris envers les produits iText (vu que je les aide à les développer).

+0

vous devez dire que vous êtes affilié à itext. – juFo

+1

J'ai mentionné mon affiliation. –