C# 使用PdfSharp将多帧/多页TIFF并发转换为PDF

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循环中的代码移动到一个新方法来实现这一点,该

我得到的代码与中接受的答案类似,只是它使用了MemoryStream(不知道为什么)。当我们有少量的帧/页面时,它工作正常,但当我们有75页或更多页面时,它的速度非常慢。我们的一些争执可能超过一千次

我正在考虑将作品分成小块/区块,每个区块将同时转换50页,然后按顺序将转换后的区块添加到生成的PDF中。示例:TIFF有200帧,因此将运行四个异步任务,每个任务有50页(chunk1=第1-50页,chunk2=第51-100页,等等)

我将通过将for循环中的代码移动到一个新方法来实现这一点,该方法将被告知要处理的起始页和结束页,然后为n个块调用该方法,其中n=(int)(frameCount/50)

然而,如果我们有一个1000页的TIFF,那就意味着20个并发任务,所以我想知道这是否是正确的方法?有编码建议吗

这是当前的代码

        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任务管理器的“性能”选项卡上的内存,看看这是否正确。