Как сгенерировать ДИНАМИЧЕСКИЙ PDF в C # с помощью iTextSharp (или другого метода)

#asp.net-mvc-3 #pdf #dynamic #itextsharp

#asp.net-mvc-3 #PDF #динамический #itext

Вопрос:

У меня есть приложение MVC3 (C #, razor) с объектом, который содержит все данные, необходимые для динамического отчета в формате PDF, который должен быть просмотрен в браузере пользователя. В моем решении Companies VS2010 уже есть iTextSharp.dll версия 5.0.5 ссылается и используется в других местах для «штамповки» значений в статической форме PDF.

Все примеры, которые я нахожу для iTextSharp, выполняют статический PDF с помощью stamper (easy) или используют 4.1.6 и используют iTextHandler. ITextHandler отсутствует в версии 5.0.5. Я безуспешно пытался использовать HTMLWorker. Мой код приведен ниже

3 способа создания динамического PDF

предпочтительное решение: 1. Я хочу привязаться к динамической форме PDF. Под динамическим я подразумеваю возможность выполнения повторяющихся подчиненных форм и т. Д. У меня есть PDF-файл, который я создал в Adobe LifeCycle ES2 и сохранил как XLA. Я вижу, что все документы Adobe ссылаются на установление соединений с XML и т.д., Но нет примеров того, как это реализовать. Я знаю, что это не может быть сложно. Пожалуйста, пример на C #?

необязательное решение: 2. Используйте то, что у меня есть сейчас (работает без iTextSharp.dll только 4.1.6) Использование

необязательное решение: 3. Сгенерируйте как HTML и начните изучать методы преобразования HTML в PDF

Код варианта 2: этот код находится в классе контроллера:

     /// <summary>
    /// Returns a PDF action result. This method renders the view to a string then
    /// use that string to generate a PDF file. The generated PDF file is then
    /// returned to the browser as binary content. The view associated with this
    /// action should render an XML compatible with iTextSharp xml format.
    /// </summary>
    /// <param name="model">The model to send to the view.</param>
    /// <returns>The resulted BinaryContentResult.</returns>
    protected ActionResult ViewPdf(object model)
    {
        // Create the iTextSharp document.
        Document doc = new Document();
        // Set the document to write to memory.
        MemoryStream memStream = new MemoryStream();
        PdfWriter writer = PdfWriter.GetInstance(doc, memStream);
        writer.CloseStream = false;
        doc.Open();

        //// Render the view xml to a string, then parse that string into an XML dom.
        string xmltext = this.RenderActionResultToString(this.View(model));

        #region  This code works with iTextSharp version 4.1.6.0 (free version of iTextSharp)
        /*
        XmlDocument xmldoc = new XmlDocument();
        xmldoc.InnerXml = xmltext.Trim();

        // Parse the XML into the iTextSharp document.
        ITextHandler textHandler = new ITextHandler(doc);
        textHandler.Parse(xmldoc);
        */
        #endregion

        #region  This code works with iTextSharp version 5.0.5 (not free version of iTextSharp)
        HTMLWorker htmlWorker = new HTMLWorker(doc);
        StringReader reader = new StringReader(xmltext);
        htmlWorker.Parse(reader);
        #endregion

        // Close and get the resulted binary data.
        doc.Close();
        byte[] buf = new byte[memStream.Position];
        memStream.Position = 0;
        memStream.Read(buf, 0, buf.Length);

        // Send the binary data to the browser.
        return new BinaryContentResult(buf, "application/pdf");
    }
    #endregion
  

Вариант 2 Код:
Этот код находится в файле представления (cshtml):

  @model SomeModelSpecificToMyPurpose
 <?xml version="1.0" encoding="UTF-8" ?>
 <itext  creationdate="@DateTime.Today" producer="iTextSharpXML">
 <paragraph leading="18.0" font="unknown" size="16.0" align="Default">
    <chunk>RTPA Result in PDF</chunk>
</paragraph>
<paragraph leading="18.0" font="unknown" size="16.0" align="Default">
    <chunk>@DateTime.Today</chunk>
</paragraph>
<paragraph leading="18.0" font="unknown" size="10.0" align="Default">
    <chunk>Customer Name: @this.Model.Transaction.PatientFirstName</chunk><newline />
    <chunk>Address: @this.Model.Transaction.ProviderFullName</chunk><newline />
</paragraph>
<paragraph leading="18.0" font="unknown" size="10.0" align="Default">
<chunk font="unknown" size="12.0">Orders:</chunk><newline />
</paragraph>
  

Ответ №1:

Формы жизненного цикла и iText не очень хорошо ладят. Он получит / установит значения, но это все.

Вы могли бы сделать что-то подобное, повторно создав свою форму в коде для каждого пользователя, но это нетривиальная задача.