0

我正在尝试使用 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 类型CloneImageProviderCloneImageProvider鉴于它并没有真正覆盖太多 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 。

有人对我在这里出错的地方有想法吗?我不可能是第一个遇到这种情况的人,这让我相信我在这里做错了什么。

4

0 回答 0