C# 使用PdfSharp将多帧/多页TIFF并发转换为PDF
我得到的代码与中接受的答案类似,只是它使用了MemoryStream(不知道为什么)。当我们有少量的帧/页面时,它工作正常,但当我们有75页或更多页面时,它的速度非常慢。我们的一些争执可能超过一千次 我正在考虑将作品分成小块/区块,每个区块将同时转换50页,然后按顺序将转换后的区块添加到生成的PDF中。示例:TIFF有200帧,因此将运行四个异步任务,每个任务有50页(chunk1=第1-50页,chunk2=第51-100页,等等) 我将通过将for循环中的代码移动到一个新方法来实现这一点,该方法将被告知要处理的起始页和结束页,然后为n个块调用该方法,其中n=(int)(frameCount/50) 然而,如果我们有一个1000页的TIFF,那就意味着20个并发任务,所以我想知道这是否是正确的方法?有编码建议吗 这是当前的代码C# 使用PdfSharp将多帧/多页TIFF并发转换为PDF,c#,pdf,tiff,pdfsharp,C#,Pdf,Tiff,Pdfsharp,我得到的代码与中接受的答案类似,只是它使用了MemoryStream(不知道为什么)。当我们有少量的帧/页面时,它工作正常,但当我们有75页或更多页面时,它的速度非常慢。我们的一些争执可能超过一千次 我正在考虑将作品分成小块/区块,每个区块将同时转换50页,然后按顺序将转换后的区块添加到生成的PDF中。示例:TIFF有200帧,因此将运行四个异步任务,每个任务有50页(chunk1=第1-50页,chunk2=第51-100页,等等) 我将通过将for循环中的代码移动到一个新方法来实现这一点,该
using (var image = System.Drawing.Image.FromStream(input))
{
using (var pdfDocument = new PdfDocument())
{
int frameCount = image.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
for (int pageIndex = 0; pageIndex < frameCount; pageIndex++)
{
image.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, pageIndex);
// Note: for some reason, when converting to XImage format, image dimensions are not retained.
// so create new tiff image from current frame
using (var frameStream = new MemoryStream())
{
image.Save(frameStream, System.Drawing.Imaging.ImageFormat.Tiff);
var frameImage = System.Drawing.Image.FromStream(frameStream);
var pdfImage = XImage.FromGdiPlusImage(frameImage);
var pdfPage = new PdfPage();
pdfPage.Width = (pdfImage.PixelWidth * 72) / pdfImage.HorizontalResolution;
pdfPage.Height = (pdfImage.PixelHeight * 72) / pdfImage.VerticalResolution;
pdfDocument.Pages.Add(pdfPage);
var xgr = XGraphics.FromPdfPage(pdfDocument.Pages[pageIndex]);
xgr.DrawImage(pdfImage, 0, 0);
}
}
var memoryStream = new MemoryStream();
pdfDocument.Save(memoryStream, false);
return memoryStream;
}
}
使用(var image=System.Drawing.image.FromStream(输入))
{
使用(var pdfDocument=new pdfDocument())
{
int frameCount=image.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
对于(int pageIndex=0;pageIndex
更新
我删除了“using(var frameStream=newmemorystream()”,根据TIFF的类型,计时提高了5-36%。新代码如下。我的1000页TIFF仍然需要三分钟才能转换。用户不仅要等待,还要从另一台计算机进行传输,所以这并不好。任务管理器显示内存消耗比CPU多,所以我怀疑并行性(每个核心一个进程)会有帮助吗
using (var image = System.Drawing.Image.FromStream(input))
{
using (var pdfDocument = new PdfDocument())
{
int frameCount = image.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
for (int pageIndex = 0; pageIndex < frameCount; pageIndex++)
{
image.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, pageIndex);
var pdfImage = XImage.FromGdiPlusImage(image);
var pdfPage = new PdfPage();
pdfPage.Width = (pdfImage.PixelWidth * 72) / pdfImage.HorizontalResolution;
pdfPage.Height = (pdfImage.PixelHeight * 72) / pdfImage.VerticalResolution;
pdfDocument.Pages.Add(pdfPage);
XGraphics xgr = XGraphics.FromPdfPage(pdfDocument.Pages[pageIndex]);
xgr.DrawImage(pdfImage, 0, 0);
}
MemoryStream memoryStream = new MemoryStream();
pdfDocument.Save(memoryStream, false);
return memoryStream;
}
}
使用(var image=System.Drawing.image.FromStream(输入))
{
使用(var pdfDocument=new pdfDocument())
{
int frameCount=image.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
对于(int pageIndex=0;pageIndex
在您费尽心机重新设计整个流程,将文档分块处理之前,您可以尝试重构代码,以消除内存流。有可能你的大文档是真正的大内存占用者,并迫使你的系统进行重击:将程序的大块内存来回移动到硬盘上。查看Windows任务管理器的“性能”选项卡上的内存,看看这是否正确。