Создание PDF с Itextsharp с изображениями из базы данных - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть процесс, где HTML хранится в базе данных с изображениями ссылок.изображения также хранятся в БД.Я создал действие контроллера, который читает изображение из базы данных.путь, который я генерирую, похож на /File/Image?path=Root/test.jpg.этот путь изображения встроен в html в тег img, например <img alt="logo" src="/File/Image?path=Root/001.jpg" />

Я пытаюсь использовать itextsharp для считывания html из базы данных и создания PDF-документа

string _html = GenerateDocumentHelpers.CommissioningSheet(fleetId);
string _html = GenerateDocumentHelpers.CommissioningSheet(fleetId);
Document _document = new Document(PageSize.A4, 80, 50, 30, 65);
MemoryStream _memStream = new MemoryStream();
PdfWriter _writer = PdfWriter.GetInstance(_document, _memStream);
StringReader _reader = new StringReader(_html);            
HTMLWorker _worker = new HTMLWorker(_document);
_document.Open();            
_worker.Parse(_reader);
_document.Close();
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=Commissioning.pdf");
Response.ContentType = "application/pdf";
Response.Buffer = true;
Response.OutputStream.Write(_memStream.GetBuffer(), 0, _memStream.GetBuffer().Length);
Response.OutputStream.Flush();
Response.End();
return new FileStreamResult(Response.OutputStream, "application/pdf");

Этот коддает мне ошибку недопустимого символа.это происходит из тега изображения, это не распознает?и = символы, есть ли способ, которым я могу отобразить этот HTML-код с тегом img, чтобы при создании PDF-файла он отображал HTML-код и изображение из базы данных и создавал PDF-файл или, если itextsharp не может этого сделать, вы можете предоставить мнелюбые другие сторонние инструменты с открытым исходным кодом, которые могут выполнить эту задачу?

1 Ответ

4 голосов
/ 28 февраля 2012

Если источник изображения не является полностью определенным URL-адресом, включая протокол, то iTextSharp предполагает, что это URL-адрес на основе файла.Решение состоит в том, чтобы просто преобразовать все ссылки на изображения в абсолютные в виде http://YOUR_DOMAIN/File/Image?path=Root/001.jpg.

. Вы также можете установить глобальное свойство в синтаксическом анализаторе, которое работает почти так же, как тег HTML <BASE>: * 1005.*

//Create a provider collection to set various processing properties
System.Collections.Generic.Dictionary<string, object> providers = new System.Collections.Generic.Dictionary<string, object>();
//Set the image base. This will be prepended to the SRC so watch your forward slashes
providers.Add(HTMLWorker.IMG_BASEURL, "http://YOUR_DOMAIN");
//Bind the providers to the worker
worker.SetProviders(providers);
worker.Parse(reader);

Ниже представлено полнофункциональное приложение WinForms на C # 2010, предназначенное для iTextSharp 5.1.2.0, которое показывает, как использовать относительное изображение и установить его базу с помощью глобального поставщика.Все в значительной степени совпадает с вашим кодом, хотя я прошёл в куче using операторов, чтобы обеспечить правильную очистку.Обязательно следите за начальными и конечными косыми чертами во всем, базовый URL-адрес добавляется непосредственно только к атрибуту SRC, и вы можете получить двойную косую черту, если она сделана неправильно.Здесь я сильно балую домен, но вы легко сможете использовать объект System.Web.HttpContext.Current.Request.

using System;
using System.IO;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            string html = @"<img src=""/images/home_mississippi.jpg"" />";
            string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "HtmlTest.pdf");
            using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
                using (Document doc = new Document(PageSize.TABLOID)) {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                        doc.Open();

                        using (StringReader reader = new StringReader(html)) {
                            using (HTMLWorker worker = new HTMLWorker(doc)) {
                                //Create a provider collection to set various processing properties
                                System.Collections.Generic.Dictionary<string, object> providers = new System.Collections.Generic.Dictionary<string, object>();
                                //Set the image base. This will be prepended to the SRC so watch your forward slashes
                                providers.Add(HTMLWorker.IMG_BASEURL, "http://www.vendiadvertising.com");
                                //Bind the providers to the worker
                                worker.SetProviders(providers);
                                worker.Parse(reader);
                            }
                        }

                        doc.Close();
                    }
                }
            }

            this.Close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...