2010-02-19 9 views
2

Je dois lire le pdf et créer le document html ... pour le cv téléversé dans mon site ... je ne peux pas employer n'importe quel shareware. s'il vous plaît quelqu'un peut-il me suggérer la meilleure solution pour convertir pdf en html ... ou lire le contenu de pdf en utilisant C#comment convertir PDF en HTML en utilisant C#

site est développé en C#, asp.net 3.5

Répondre

1

je suis arrivé d'un code de here

et downlaoded itextsharp dll

et ce code a bien fonctionné ... seul problème que je dû faire face ... que ma plupart des fichiers sont convertis en texte ou html ou quel que soit frmat je veux ... mais seulement 1 fichier je ne suis pas capable de convertir ... si quelqu'un peut utiliser ce code et m'aider à trouver ce qui est le proble ... je serai reconnaissant à lui /sa.

vous pouvez voir le code ici ...

using System; 
using System.IO; 
using iTextSharp.text.pdf; 
using System.Text.RegularExpressions; 

namespace PDFReader 
{ 
    /// <summary> 
    /// Parses a PDF file and extracts the text from it. 
    /// </summary> 
    public class PDFParser 
    { 
     /// BT = Beginning of a text object operator 
     /// ET = End of a text object operator 
     /// Td move to the start of next line 
     /// 5 Ts = superscript 
     /// -5 Ts = subscript 

     #region Fields 

     #region _numberOfCharsToKeep 
     /// <summary> 
     /// The number of characters to keep, when extracting text. 
     /// </summary> 
     private static int _numberOfCharsToKeep = 15; 
     #endregion 

     #endregion 

     #region ExtractText 
     /// <summary> 
     /// Extracts a text from a PDF file. 
     /// </summary> 
     /// <param name="inFileName">the full path to the pdf file.</param> 
     /// <param name="outFileName">the output file name.</param> 
     /// <returns>the extracted text</returns> 
     public bool ExtractText(string inFileName, string outFileName) 
     { 
      StreamWriter outFile = null; 
      try 
      { 
       // Create a reader for the given PDF file 
       PdfReader reader = new PdfReader(inFileName); 
       //outFile = File.CreateText(outFileName); 
       outFile = new StreamWriter(outFileName, false, System.Text.Encoding.UTF8); 

       Console.Write("Processing: "); 

       int totalLen = 68; 
       float charUnit = ((float)totalLen)/(float)reader.NumberOfPages; 
       int totalWritten = 0; 
       float curUnit = 0; 

       for (int page = 1; page <= reader.NumberOfPages; page++) 
       { 
        outFile.Write(ExtractTextFromPDFBytes(reader.GetPageContent(page)) + " "); 

        // Write the progress. 
        if (charUnit >= 1.0f) 
        { 
         for (int i = 0; i < (int)charUnit; i++) 
         { 
          Console.Write("#"); 
          totalWritten++; 
         } 
        } 
        else 
        { 
         curUnit += charUnit; 
         if (curUnit >= 1.0f) 
         { 
          for (int i = 0; i < (int)curUnit; i++) 
          { 
           Console.Write("#"); 
           totalWritten++; 
          } 
          curUnit = 0; 
         } 

        } 
       } 

       if (totalWritten < totalLen) 
       { 
        for (int i = 0; i < (totalLen - totalWritten); i++) 
        { 
         Console.Write("#"); 
        } 
       } 
       return true; 
      } 
      catch 
      { 
       return false; 
      } 
      finally 
      { 
       if (outFile != null) outFile.Close(); 
      } 
     } 
     #endregion 

     #region ExtractTextFromPDFBytes 
     /// <summary> 
     /// This method processes an uncompressed Adobe (text) object 
     /// and extracts text. 
     /// </summary> 
     /// <param name="input">uncompressed</param> 
     /// <returns></returns> 
     public 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 (input[i] == 213) 
         c = "'".ToCharArray()[0]; 

        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) 
             { 
              resultString += c.ToString(); 
              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 CleanupContent(resultString); 
      } 
      catch 
      { 
       return ""; 
      } 
     } 

     private string CleanupContent(string text) 
     { 
      string[] patterns = { @"\\\(", @"\\\)", @"\\226", @"\\222", @"\\223", @"\\224", @"\\340", @"\\342", @"\\344", @"\\300", @"\\302", @"\\304", @"\\351", @"\\350", @"\\352", @"\\353", @"\\311", @"\\310", @"\\312", @"\\313", @"\\362", @"\\364", @"\\366", @"\\322", @"\\324", @"\\326", @"\\354", @"\\356", @"\\357", @"\\314", @"\\316", @"\\317", @"\\347", @"\\307", @"\\371", @"\\373", @"\\374", @"\\331", @"\\333", @"\\334", @"\\256", @"\\231", @"\\253", @"\\273", @"\\251", @"\\221" }; 
      string[] replace = { "(", ")", "-", "'", "\"", "\"", "à", "â", "ä", "À", "Â", "Ä", "é", "è", "ê", "ë", "É", "È", "Ê", "Ë", "ò", "ô", "ö", "Ò", "Ô", "Ö", "ì", "î", "ï", "Ì", "Î", "Ï", "ç", "Ç", "ù", "û", "ü", "Ù", "Û", "Ü", "®", "™", "«", "»", "©", "'" }; 

      for (int i = 0; i < patterns.Length; i++) 
      { 
       string regExPattern = patterns[i]; 
       Regex regex = new Regex(regExPattern, RegexOptions.IgnoreCase); 
       text = regex.Replace(text, replace[i]); 
      } 

      return text; 
     } 

     #endregion 

     #region CheckToken 
     /// <summary> 
     /// Check if a certain 2 character token just came along (e.g. BT) 
     /// </summary> 
     /// <param name="tokens">the searched token</param> 
     /// <param name="recent">the recent character array</param> 
     /// <returns></returns> 
     private bool CheckToken(string[] tokens, char[] recent) 
     { 
      try 
      { 
       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; 
        } 
       } 
      } 
      catch (Exception) 
      { 
       return true; 
      } 
      return false; 
     } 
     #endregion 
    } 
} 

Je reçois l'erreur "Index out of range" en fonction

CheckToken

+0

Hey, pouvez-vous me dire comment convertir PDF en HTML en utilisant ce code? Ce serait vraiment bien si tu m'aides parce que j'ai de gros problèmes. – Anvesh

0

Dépend de ce que vous voulez faire. Convertir pdfs en texte brut sans mise en forme peut être fait avec pdftotext ou des solutions similaires. Convertir la mise en page PDF en mise en page HTML est très difficile car la philosophie de conception PDF est très différente de la façon dont la mise en page HTML fonctionne. Google a une sorte de solution pour cela, mais elle va généralement casser la mise en page.

Concernant votre concept de CV: Comme la mise en page CV est très importante pour les clients qui utilisent un site, je ne voudrais pas convertir automatiquement les CV PDF en CV HTML. Ce que pdftotext peut vous offre est un texte en clair où un moteur de recherche de CV peut trouver des parties du CV.

+0

mais veulent fournir des installations de contenu recherche pour cela ... pdf à la conversion de texte est nécessaire – Radhi

0

vous pouvez convertir le pdf en image avec ghostscript et C#, puis publier l'image sur le site. Pour plus de détails voir cette article

Questions connexes