PDFを画像に変換したい。私は Leadtools を使用しており、速度を上げるために、次の方法でマルチスレッドを使用しています。
string multiPagePDF = @"Manual.pdf";
string destFileName = @"output\Manual";
Task.Factory.StartNew(() =>
{
using (RasterCodecs codecs = new RasterCodecs())
{
CodecsImageInfo info = codecs.GetInformation(multiPagePDF, true);
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 5;
Parallel.For(1, multiPagePDF.TotalPages+1, po, i =>
{
RasterImage image = codecs.Load(multiPagePDF, i);
codecs.Save(image, destFileName + i + ".png", RasterImageFormat.Png, 0);
});
}
});
これはスレッドセーフな方法ですか?予期しない出力が発生しますか? これを数回試したところ、特定のページが出力画像に 2 回表示される場合がありました。
解決
Leadtools のオンライン チャット サポート (これは非常に役に立ちます) によると、Rastercodecs.load はスレッド セーフではなく、上記のコードは予期しない出力になります (私の場合、ページ 1 は出力セットの画像で 2 回発生しました)。解決策は、Parallel.For 内で codecs 変数を定義して、反復ごとに独自の RasterCodec に個別にアクセスすることです。