我想将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在线聊天支持(这是非常有用的btw),Rastercodecs.load不是线程安全的,上面的代码会导致意外输出(在我的情况下,Page 1在输出图像集中出现两次)。解决方案是在Parallel.For中定义编解码器变量,以便每次迭代分别访问自己的RasterCodecs。
答案 0 :(得分:3)
Amyn, 正如您所知,在这种情况下使用RasterCodecs对象的正确方法是:
Task.Factory.StartNew(() =>
{
using (RasterCodecs codecs = new RasterCodecs())
{
CodecsImageInfo info = codecs.GetInformation(multiPagePDF, true);
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 5;
Parallel.For(1, info.TotalPages + 1, po, i =>
{
using(RasterCodecs codecs2 = new RasterCodecs()) {
RasterImage image = codecs2.Load(multiPagePDF, i);
codecs2.Save(image, destFileName + i + ".png", RasterImageFormat.Png, 0);
}
});
}
});
这使您在多核处理器上运行时具有相同的速度优势,而不会在并发线程之间造成任何冲突。
LEADTOOLS RasterCodecs.Load()和RasterCodecs.Save()方法是线程安全的。创建RasterCodecs类的多个实例背后的原因是因为此类在内部使用包含许多不同加载和结构的结构。保存文件选项。跨多个线程使用这些结构(这些选项被更改)可能会导致不可预测的结果。加载选项结构中的一个这样的属性是页码。因此,建议使用此类的单独实例。