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