我正在尝试使用XmlWorker将一些HTML转换为PDF。 HTML文本正在正确转换为PDF,但没有插入图像。
我创建了一个自定义IImageProvider类,以便直接访问存储在数据库中的图像,而不是通过HTML Handler。这应该没有问题,但我的IImageProvider上的方法永远不会被GetImageRootPath方法调用。
我已经按照这些例子进行了数十次审查,并且不明白我做错了什么。我也使用Reflector进行调试并逐步完成,似乎发现了一个问题。这可能是HtmlPipelineContext
对象中的错误,也可能是我没有正确使用这些类。
以下是设置XmlWorker的代码:
var imageProvider = new DatabaseImageProvider();
var htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
htmlContext.SetImageProvider(imageProvider);
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
var pipeline = new CssResolverPipeline(cssResolver,
new HtmlPipeline(htmlContext, new PdfWriterPipeline(doc, pdfWriter)));
var xmlWorker = new XMLWorker(pipeline, true);
var xmlParser = new XMLParser(xmlWorker);
基于我见过的例子,上面的代码似乎很标准。现在,图像的问题似乎来自HtmlPipelineContext对象的内部克隆方法。 Clone方法调用当前设置的ImageProvider的GetImageRootPath
方法,然后将ImageProvider替换为类型为CloneImageProvider
的新ImageProvider。对于实际从任何地方获取图像,CloneImageProvider
似乎并没有做太多的事情,因为它并没有真正覆盖AbstractImageProvider
。
//This is from iTextSharp.tool.xml.pipeline.html.HtmlPipelineContext
public object Clone()
{
CssAppliers cloneCssApliers = this.cssAppliers.Clone();
HtmlPipelineContext newCtx = new HtmlPipelineContext(cloneCssApliers);
if (this.imageProvider != null)
{
String rootPath = imageProvider.GetImageRootPath();
newCtx.SetImageProvider(new CloneImageProvider(rootPath));
}
if (null != this.charset)
{
newCtx.CharSet(Encoding.GetEncoding(this.charset.CodePage));
}
newCtx.SetPageSize(new Rectangle(this.pageSize)).SetLinkProvider(this.linkprovider)
.SetRootTags(new List<String>(this.roottags)).AutoBookmark(this.autoBookmark)
.SetTagFactory(this.tagFactory).SetAcceptUnknown(this.acceptUnknown);
return newCtx;
}
我为HtmlPipeline
完全克隆HtmlPipelineContext
而感到茫然,但我真的不关心它的实现。我的问题似乎是返回的克隆没有携带我的IImageProvider,我已经使用SetImageProvider
方法明确设置了它。
任何人都有关于我在哪里出错的想法?我不可能是第一个碰到这个的人,这让我相信我在这里做错了。