iTextSharp XmlWorker在Pdf中丢失图像

时间:2013-06-10 03:45:50

标签: itext

我正在尝试使用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方法明确设置了它。

任何人都有关于我在哪里出错的想法?我不可能是第一个碰到这个的人,这让我相信我在这里做错了。

0 个答案:

没有答案