我正在尝试使用 XmlWorker 将一些 HTML 转换为 PDF。HTML 文本已正确转换为 PDF,但未插入任何图像。
我创建了一个自定义 IImageProvider 类,以便直接访问存储在数据库中的图像,而不是通过 HTML 处理程序。这应该没有问题,但是除了 GetImageRootPath 方法之外,我的 IImageProvider 上的方法永远不会被调用。
我已经按照这些示例进行了数十次审查,但不明白我做错了什么。我也使用反射器进行调试和单步执行,似乎发现了一个问题。这可能是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 方法。Clone 方法调用GetImageRootPath
当前设置的 ImageProvider 的方法,然后将 ImageProvider 替换为新的 ImageProvider 类型CloneImageProvider
。CloneImageProvider
鉴于它并没有真正覆盖太多 from ,因此实际上从任何地方获取图像似乎并没有做太多事情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
,但我真的不关心它的实现。我的问题似乎是返回的克隆没有携带我使用该SetImageProvider
方法明确设置的 IImageProvider 。
有人对我在这里出错的地方有想法吗?我不可能是第一个遇到这种情况的人,这让我相信我在这里做错了什么。