2014-01-27 2 views
0

현재 주요 개발자가 사용할 수 없으므로 클라이언트 용 데모를 완료해야합니다. 내가 가지고있는 모든 프로그래밍 경험은 C# 5 년 전 칼을 짧게 넘어 섰지 만 사용하지는 못했습니다.데이터를 xml로 변경

내 보낸 데이터를 XML로 변환하는 데 도움이 필요합니다. 현재 우리는 PDF 형식을 취하는 빌드를 가지고 명령 프롬프트를 통해 작동하도록 표시된 필수 데이터를 추출합니다. 이 데이터를 XML로 변환 할 수 있어야 데이터베이스에 쿼리 할 수 ​​있습니다. 프로그램의 아이디어는 PDF에서 XML로 변환하고 데이터가 저장된 데이터베이스로 쿼리하는 데 필요한 데이터를 가져 오는 것입니다. 우리는 iTextsharp 라이브러리와 함께 C# 언어를 사용하고 있습니다. 나는 코드를 게시 할 것이지만 나는 그렇게 할 수 없다.

누구든지 나를 도와 줄 수 있습니까? 어쩌면 이것이 어떻게 행해졌는지에 대한 예를 향해 나를 가리키며 가능한 한 간단하게 어떻게 설명 할 것인가? 나는 보통 다른 사람들에게 도움을 청하지는 않겠지 만 몇 년 후에 코딩하지 않았다는 사실 때문에 협박감을 느끼게했습니다.

+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 데이터를 데이터베이스에 저장합니다.

관련 문제