我想将 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);
});
}
});
这是一种线程安全的方式吗?它会导致意外的输出吗?我尝试了几次,并且在某些情况下,特定页面在输出图像中出现了两次。
解决方案
根据 Leadtools 在线聊天支持(顺便说一句非常有帮助),Rastercodecs.load 不是线程安全的,上面的代码会导致意外输出(在我的例子中,第 1 页在输出图像集中出现了两次)。解决方案是在 Parallel.For 中定义编解码器变量,以便每次迭代单独访问其自己的 RasterCodecs。