【问题标题】:using iTextSharp with MVC将 iTextSharp 与 MVC 一起使用
【发布时间】:2011-02-25 04:35:40
【问题描述】:

我有一个关于使用 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");

    }

【问题讨论】:

    标签: c# model-view-controller itextsharp


    【解决方案1】:

    我要更改的方法的唯一主要组成部分是返回数据的方式。现在您使用的是固定文件路径,这意味着两个人同时发出请求将导致其中一个人出错。由于您没有保存文件以供以后使用,因此我将完全跳过 FileStream 并使用 MemoryStream。然后,您可以使用 FileStreamResult 返回 MIME 类型为application/pdf 的流。

    对于第二部分,你会遇到一些麻烦。 PDF 和 HTML 不相关,因此 HTML 标签(只是纯文本)在 PDF 文档中没有特殊含义。如果您想将用户 HTML(由您的富文本控件生成)转换为合适的 PDF 富文本,您将需要中间的 HTML 解析器。

    iText 包括HTMLWorker 类,它是一个部分 HTML 解析器(意味着它不会处理所有 html 标记或结构),旨在返回与 PDF 兼容的块。您也可以使用HTMLAgilityPack 之类的东西来更好地控制要转换的标签,但是您必须自己进行翻译。您还可以检查您的富编辑控件,看看它是否可以以更易于解析的格式返回富文本。

    【讨论】:

    • 感谢大卫的回复。是的,我担心 FileStream。我希望能够打开模板 PDF 并用我的数据库中的数据填充它,但是正如您所说,我不需要保存生成的文件以供以后使用。你有任何可以分享的示例代码吗?我只是想把它搞定。在 HTML 标记前面 - 我将尝试 HTMLWorker 类。
    • 我有 HTMLWorker 类解析 HTML,但我不明白是否可以格式化 PDF 中的文本,使其看起来与 HTML 中的相似......需要建议!
    猜你喜欢
    • 2013-11-20
    • 2016-05-22
    • 2015-06-25
    • 1970-01-01
    • 2012-06-02
    • 2010-10-04
    • 2017-08-27
    • 2010-09-09
    • 2011-06-26
    相关资源
    最近更新 更多