0

XmlWorker を使用して HTML を PDF に変換しようとしています。HTML テキストは PDF に正しく変換されていますが、画像が挿入されていません。

HTML ハンドラーを経由する代わりに、データベースに保存されている画像に直接アクセスするために、カスタム IImageProvider クラスを作成しました。これは問題なく動作するはずですが、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 メソッドから発生しているようです。Clone メソッドはGetImageRootPath、現在設定されている ImageProvider のメソッドを呼び出し、その ImageProvider を type の新しい ImageProvider に置き換えCloneImageProviderます。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です。

ここで私がどこで間違っているのか、誰にもアイデアがありますか? 私がこれに出くわした最初の人になることはおそらくないので、ここで何か間違ったことをしていると思います.

4

0 に答える 0