Каждый раз, когда я сталкивался с этим, проблема заключалась в том, что изображение было слишком большим для холста.Более конкретно, даже голый тег IMG
внутри будет обернут в Chunk
, который будет обернут в Paragraph
, и я думаю, что изображение переполняет абзац, но я не уверен на 100%.
Два простых исправления: увеличить холст или указать размеры изображения в теге HTML IMG
.Третий, более сложный маршрут - использование дополнительного провайдера IMG_PROVIDER
.Для этого вам необходимо реализовать интерфейс IImageProvider
.Ниже приведена очень простая версия одного
public class ImageThing : IImageProvider {
//Store a reference to the main document so that we can access the page size and margins
private Document MainDoc;
//Constructor
public ImageThing(Document doc) {
this.MainDoc = doc;
}
Image IImageProvider.GetImage(string src, IDictionary<string, string> attrs, ChainedProperties chain, IDocListener doc) {
//Prepend the src tag with our path. NOTE, when using HTMLWorker.IMG_PROVIDER, HTMLWorker.IMG_BASEURL gets ignored unless you choose to implement it on your own
src = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\" + src;
//Get the image. NOTE, this will attempt to download/copy the image, you'd really want to sanity check here
Image img = Image.GetInstance(src);
//Make sure we got something
if (img == null) return null;
//Determine the usable area of the canvas. NOTE, this doesn't take into account the current "cursor" position so this might create a new blank page just for the image
float usableW = this.MainDoc.PageSize.Width - (this.MainDoc.LeftMargin + this.MainDoc.RightMargin);
float usableH = this.MainDoc.PageSize.Height - (this.MainDoc.TopMargin + this.MainDoc.BottomMargin);
//If the downloaded image is bigger than either width and/or height then shrink it
if (img.Width > usableW || img.Height > usableH) {
img.ScaleToFit(usableW, usableH);
}
//return our image
return img;
}
}
. Чтобы использовать этого провайдера, просто добавьте его в коллекцию провайдеров, как вы это сделали с HTMLWorker.IMG_BASEURL
:
providers.Add(HTMLWorker.IMG_PROVIDER, new ImageThing(doc));
. Следует отметить, чтоесли вы используете HTMLWorker.IMG_PROVIDER
, то вы несете ответственность за выяснение всего, что касается изображения.Приведенный выше код предполагает, что все пути к изображениям должны начинаться с константной строки, возможно, вы захотите обновить это и проверить на наличие HTTP
в начале.Кроме того, поскольку мы говорим, что хотим полностью обработать конвейер обработки изображений, поставщик HTMLWorker.IMG_BASEURL
больше не нужен.
Основной цикл кода теперь будет выглядеть примерно так:
string html = @"<img src=""Untitled-1.png"" />";
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.A4, 50, 50, 80, 100)) {
using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
doc.Open();
using (StringReader sr = new StringReader(html)) {
System.Collections.Generic.Dictionary<string, object> providers = new System.Collections.Generic.Dictionary<string, object>();
providers.Add(HTMLWorker.IMG_PROVIDER, new ImageThing(doc));
var parsedHtmlElements = HTMLWorker.ParseToList(sr, null, providers);
foreach (var htmlElement in parsedHtmlElements) {
doc.Add(htmlElement as IElement);
}
}
doc.Close();
}
}
}
И последнее, убедитесь, что вы указали, какую версию iTextSharp вы нацеливаете при публикации здесь.Приведенный выше код предназначен для iTextSharp 5.1.2.0, но я думаю, что вы можете использовать серию 4.X.