Если источник изображения не является полностью определенным 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();
}
}
}