2014-01-27 89 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數據存儲到數據庫。