используя iTextSharp с MVC - PullRequest
2 голосов
/ 28 мая 2010

У меня есть вопрос из двух частей об использовании iTextSharp. Я создал простое приложение MVC для хранения информации об «извлеченных уроках» в базе данных SQL Server. Когда пользователь просматривает детали урока, я хочу, чтобы он мог сохранить урок в формате PDF. У меня есть некоторый рабочий код, но 1) я не уверен, насколько здравым является мой подход и 2) приложение MVC использует редактор форматированного текста TinyMCE, и когда я помещаю форматированный текст в PDF, отображаются HTML-теги. Как получить PDF-файл для форматирования HTML (полужирные шрифты, неупорядоченные списки, абзацы и т. Д.)?

Ниже приведен код, который я использую для создания PDF. Буду очень признателен за обратную связь, если я расскажу об этом неправильно.

Спасибо.

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");

    }

1 Ответ

3 голосов
/ 28 мая 2010

Единственный важный компонент вашего подхода, который я бы изменил, - это способ возврата данных. Прямо сейчас вы используете фиксированный путь к файлу, что означает, что два человека, делающие запросы одновременно, приведут к тому, что один из них получит ошибку. Поскольку вы не сохраняете файл для последующего использования, я бы полностью пропустил FileStream и использовал бы MemoryStream. Затем вы можете использовать FileStreamResult для возврата потока с типом MIME application/pdf.

Во второй части у вас будут проблемы. PDF и HTML не связаны между собой, поэтому теги HTML (которые представляют собой просто текст) не имеют особого значения в документе PDF. Если вы хотите преобразовать пользовательский HTML (сгенерированный вашим элементом управления расширенным текстом) в подходящий форматированный PDF, вам понадобится анализатор HTML посередине.

iText включает в себя класс HTMLWorker, который является частичным HTML-парсером (то есть он не будет обрабатывать все html-теги или структуры), предназначенный для возврата фрагментов, совместимых с PDF. Вы также можете использовать что-то вроде HTMLAgilityPack , чтобы иметь больше контроля над тем, какие теги конвертируются, но тогда вам придется выполнять перевод самостоятельно. Вы также можете проверить свой элемент управления rich edit, чтобы узнать, может ли он вернуть форматированный текст в более удобном для анализа формате.

...