2010-05-28 11 views
2

J'ai une question en deux parties sur l'utilisation de iTextSharp. J'ai construit une application MVC simple pour stocker des informations sur les «leçons apprises» dans une base de données SQL Server. Quand un utilisateur regarde les détails d'une leçon, je veux qu'ils soient en mesure de sauvegarder la leçon en format PDF. J'ai un peu de code de travail mais 1) Je ne suis pas sûr comment mon approche est et 2) l'application MVC utilise un éditeur de texte riche TinyMCE et quand je mets le texte riche dans le PDF les balises html sont affichées. Comment puis-je obtenir le PDF pour honorer le formatage html (polices en gras, listes non ordonnées, paragraphes, etc.)?en utilisant iTextSharp avec MVC

Voici le code que j'utilise pour générer le PDF. J'apprécierais vraiment la rétroaction si je vais mal à ce sujet.

Merci.

public FilePathResult GetPDF(int id) 
    { 
     Lesson lesson = lessonRepository.GetLesson(id); 

     string pdf = @"C:\Projects\Forms\LessonsLearned\PDF\template_test.pdf"; 
     string outputFilePath = @"C:\Temp\pdf_output\test_template_filled.pdf"; 

     PdfReader pdfReader = null; 

     try 
     { 

      pdfReader = new PdfReader(pdf); 

      using (FileStream pdfOutputFile = new FileStream(outputFilePath, FileMode.Create)) 
      { 
       PdfStamper pdfStamper = null; 
       try 
       { 
        pdfStamper = new PdfStamper(pdfReader, pdfOutputFile); 

        AcroFields acroFields = pdfStamper.AcroFields; 

        acroFields.SetField("title", lesson.Title); 
        acroFields.SetField("owner", lesson.Staff.FullName); 
        acroFields.SetField("date", lesson.DateEntered.ToShortDateString()); 
        // field with rich text      
        acroFields.SetField("situation", Server.HtmlDecode(lesson.Situation)); 
        acroFields.SetField("description", Server.HtmlDecode(lesson.Description)); 

        pdfStamper.FormFlattening = true; 

       } 
       finally 
       { 
        if (pdfStamper != null) 
        { 
         pdfStamper.Close(); 
        } 
       } 
      } 
     } 
     finally 
     { 
      pdfReader.Close(); 
     } 

     return File(outputFilePath, "application/pdf", "Lesson_" + lesson.ID + ".pdf"); 

    } 

Répondre

3

Le seul composant majeur de votre approche que je changerais est comment les données sont retournées. À l'heure actuelle, vous utilisez un chemin de fichier fixe, ce qui signifie que deux personnes effectuant des demandes en même temps entraînent l'apparition d'une erreur. Comme vous ne sauvegardez pas le fichier pour une utilisation ultérieure, je passerais entièrement le FileStream et utiliserais un MemoryStream. Vous pouvez ensuite utiliser FileStreamResult pour renvoyer le flux avec un type MIME de application/pdf.

Pour la deuxième partie, vous aurez quelques problèmes. PDF et HTML ne sont pas liés, donc les balises HTML (qui ne sont que du texte) n'ont pas de signification particulière dans un document PDF. Si vous voulez convertir un HTML utilisateur (généré par votre contrôle de texte enrichi) en un texte riche en PDF approprié, vous aurez besoin d'un analyseur HTML au milieu.

iText inclut la classe HTMLWorker, qui est un analyseur syntaxique HTML partielle (ce qui signifie qu'il ne traitera pas toutes les balises html ou structures) conçus pour renvoyer des morceaux compatibles PDF. Vous pouvez également utiliser quelque chose comme le HTMLAgilityPack pour avoir plus de contrôle sur les balises qui sont converties, mais vous devrez ensuite faire la traduction vous-même. Vous pouvez également examiner votre contrôle d'édition enrichi, pour voir s'il peut renvoyer du texte enrichi dans un format plus facile à analyser.

+0

Merci pour la réponse David. Oui, j'étais inquiet au sujet du FileStream. Je veux être en mesure d'ouvrir un fichier PDF de modèle et le remplir avec les données de ma base de données mais, comme vous le dites, je n'ai pas besoin de sauvegarder le fichier résultant pour une utilisation ultérieure. Avez-vous un exemple de code que vous pourriez partager? Je suis juste en train de pirater ça ensemble. Sur le front de balise HTML - je vais essayer la classe HTMLWorker. – user353024

+0

J'ai la classe HTMLWorker en train d'analyser le HTML mais ce que je ne comprends pas, c'est s'il est possible de formater le texte dans le PDF pour qu'il ressemble à HTML ... a besoin de conseils s'il vous plait! – user353024