使用包含来自数据库的图像的itextsharp创建pdf

时间:2012-02-26 22:08:23

标签: html database image pdf itext

我有一个过程,其中html存储在带有图像链接的数据库中。图像也存储在db中。我已经创建了一个控制器动作,它从数据库中读取图像。我正在生成的路径类似于/File/Image?path=Root/test.jpg。 此图片路径嵌入在img标记中的html中,如<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");

此代码给我一个非法的字符错误。这来自图片标签,它无法识别?和=字符,有没有办法我可以用img标签渲染这个html,这样当我创建一个pdf时,它会从数据库中呈现html和图像并创建一个pdf,或者如果itextsharp不能这样做,你能为我提供吗?任何其他可以完成这项任务的第三方开源工具?

1 个答案:

答案 0 :(得分:4)

如果图像源不是包含协议的完全限定URL,则iTextSharp会假定它是基于文件的URL。解决方案是将所有图像链接转换为绝对格式http://YOUR_DOMAIN/File/Image?path=Root/001.jpg

您还可以在解析器上设置一个与HTML <BASE>标记非常相似的全局属性:

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

以下是针对iTextSharp 5.1.2.0的全功能C#2010 WinForms应用程序,该应用程序展示了如何使用相对图像并使用全局提供程序设置其基础。尽管我通过一堆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();
        }
    }
}