2014-01-27 53 views
0

由于我们的主要开发人员目前不可用,因此我一直负责为客户完成演示。我拥有的所有编程经验是,我在5年前曾经与C#交锋过,但从未使用过。将数据更改为xml

如果有意义,我需要帮助将导出的数据转换为XML。目前我们有一个构建,它采用PDF格式提取所需的数据,通过命令提示符显示工作。我需要能够将这些数据转换为XML,因此可以查询数据库。该程序的想法是从PDF中获取所需数据,将其转换为XML并将其查询到存储数据的数据库。我们将C#语言与iTextsharp库结合使用。我会发布代码,但我不允许。

所以我问任何人可以帮我吗?也许可以向我展示这是如何完成的例子,或者尽可能简单地解释我将如何去做这件事?我通常不会寻求别人的帮助,而是因为我多年没有编码的事实,这让我感到害怕。

+0

一种选择是创建模拟您的数据的类(即字段/属性),为PDF数据中的每个“实体”创建对象并将对象序列化为XML。 StackOverflow和MSDN上的XML序列化中有大量示例。主要想法是创建一个缓冲区(类对象),您可以在其中构建您从PDF接收的数据。 –

+0

如果客户想要的最终产品是数据库中的数据,那么为什么要先将它放入XML中? –

+0

我真的不能告诉你为什么,因为这是一个更大的图片,这样做使我们能够使用代码来处理其他更重要的事情。 – Charlie

回答

0

这可能证明有用的你......从a way to parse PDF data using iTextSharp

using iTextSharp.text.pdf; 
using iTextSharp.text; 

private void openPDF() 
{ 
    string str = ""; 
    string newFile = "c:\\New Document.pdf"; 
    Document doc = new Document(); 

    PdfReader reader = new PdfReader("c:\\New Document.pdf"); 
    for (int i = 1; i <= reader.NumberOfPages; i++) 
    { 
     byte[] bt = reader.GetPageContent(i); 
     str += ExtractTextFromPDFBytes(bt); 
    } 
} 

private string ExtractTextFromPDFBytes(byte[] input) 
{ 
    if (input == null || input.Length == 0) return ""; 

    try 
    { 
     string resultString = ""; 

     // Flag showing if we are we currently inside a text object 
     bool inTextObject = false; 


     // Flag showing if the next character is literal 
     // e.g. '\\' to get a '\' character or '\(' to get '(' 
     bool nextLiteral = false; 


     //() Bracket nesting level. Text appears inside() 
     int bracketDepth = 0; 


     // Keep previous chars to get extract numbers etc.: 
     char[] previousCharacters = new char[_numberOfCharsToKeep]; 
     for (int j = 0; j < _numberOfCharsToKeep; j++) previousCharacters[j] = ' '; 

     for (int i = 0; i < input.Length; i++) 
     { 
      char c = (char)input[i]; 

      if (inTextObject) 
      { 
       // Position the text 
       if (bracketDepth == 0) 
       { 
        if (CheckToken(new string[] { "TD", "Td" }, previousCharacters)) 
        { 
         resultString += "\n\r"; 
        } 
        else 
        { 
         if (CheckToken(new string[] { "'", "T*", "\"" }, previousCharacters))  { 
          resultString += "\n"; 
         } 
         else 
         { 
          if (CheckToken(new string[] { "Tj" }, previousCharacters)) 
          { 
           resultString += " "; 
          } 
         } 
        } 
       } 

       // End of a text object, also go to a new line. 
       if (bracketDepth == 0 && CheckToken(new string[] { "ET" }, previousCharacters)) 
       { 
        inTextObject = false; 
        resultString += " "; 
       } 
       else 
       { 
        // Start outputting text 
        if ((c == '(') && (bracketDepth == 0) && (!nextLiteral)) 
        { 
         bracketDepth = 1; 
        } 
        else 
        { 
         // Stop outputting text 
         if ((c == ')') && (bracketDepth == 1) && (!nextLiteral)) 
         { 
          bracketDepth = 0; 
         } 
         else 
         { 
          // Just a normal text character: 
          if (bracketDepth == 1) 
          { 
           // Only print out next character no matter what. 
           // Do not interpret. 
           if (c == '\\' && !nextLiteral) 
           { 
            nextLiteral = true; 
           } 
           else 
           { 
            if (((c >= ' ') && (c <= '~')) || ((c >= 128) && (c < 255))) 
            { 
             resultString += c.ToString(); 
            } 


            nextLiteral = false; 
           } 
          } 
         } 
        } 
       } 
      } 


      // Store the recent characters for 
      // when we have to go back for a checking 
      for (int j = 0; j < _numberOfCharsToKeep - 1; j++) 
      { 
       previousCharacters[j] = previousCharacters[j + 1]; 
      } 

      previousCharacters[_numberOfCharsToKeep - 1] = c; 

      // Start of a text object 
      if (!inTextObject && CheckToken(new string[] { "BT" }, previousCharacters)) 
      { 
       inTextObject = true; 
      } 
     } 

     return resultString; 
    } 
    catch 
    { 
     return string.Empty; 
    } 
} 


private bool CheckToken(string[] tokens, char[] recent) 
{ 
    foreach (string token in tokens) 
    { 
     if ((recent[_numberOfCharsToKeep - 3] == token[0]) && 
     (recent[_numberOfCharsToKeep - 2] == token[1]) && 
     ((recent[_numberOfCharsToKeep - 1] == ' ') || 
     (recent[_numberOfCharsToKeep - 1] == 0x0d) || 
     (recent[_numberOfCharsToKeep - 1] == 0x0a)) && 
     ((recent[_numberOfCharsToKeep - 4] == ' ') || 
     (recent[_numberOfCharsToKeep - 4] == 0x0d) || 
     (recent[_numberOfCharsToKeep - 4] == 0x0a))) 
     { 
       return true; 
     } 
    } 

    return false; 
} 

两者一旦数据被解析它,然后每一行转换为一个类(如在您的文章的评论建议安德烈V)的问题,将其序列化为XML,然后将XML文件本身存储到数据库或将XML数据存储到数据库。