2013-10-30 93 views
0

我使用ImageMagick.NET從pdf生成圖像。它的工作,但轉換過程太慢。代碼 - >ImageMagick Pdf到圖像轉換太慢

public void ProcessRequest(HttpContext context) 
    { 
     if (context.Request["id"] != null) 
     { 
      string id = context.Request["id"].ToString(); 


      MagickReadSettings settings = new MagickReadSettings(); 
      settings.Density = new MagickGeometry(300, 300); 

      using (MagickImageCollection images = new MagickImageCollection()) 
      { 
       images.Read(System.Web.HttpContext.Current.Server.MapPath(string.Format("~/Reciepts/order{0}.pdf", id)), settings); 

       MagickImage vertical= images.AppendVertically(); 
       using (var memoryStream = new MemoryStream()) 
       { 
        vertical.ToBitmap().Save(memoryStream, ImageFormat.Jpeg); 
        var d = memoryStream.GetBuffer(); 
        context.Response.Clear(); 
        context.Response.ContentType = "image/jpeg"; 
        context.Response.BinaryWrite(d); 
        context.Response.End(); 
       } 
      } 

     } 
    } 

我在哪裏可以改進?

回答

2

您正在使用Magick.NET而不是ImageMagick.NET。

在將它發送到輸出流之前,不需要創建位圖。你可以這樣做:

using (MagickImage vertical=images.AppendVertically()) 
{ 
    vertical.Format = MagickFormat.Jpeg; 
    vertical.Write(context.Response.OutputStream); 
} 

也許你應該緩存結果到文件?

+0

ImageMagick.NET是否需要安裝GhostScript? –

+1

只有在閱讀.PDF/.EPS文件時才需要Ghostscript。 – dlemstra

+0

感謝您的信息。 –

1

如果您決定使用Magick.NET,方法沒有錯。 第一個答案爲MagickImage提供了「使用」語句。 但是,這隻差幾毫秒才能完成這項工作。

我看到慢行是這一行:

images.Read(System.Web.HttpContext.Current. 
    Server.MapPath(string.Format("~/Reciepts/order{0}.pdf", id)), settings); 

因爲設置對象的屬性。 你的財產說,圖像必須在300DPI和300可能是你的CPU非常高:

settings.Density = new MagickGeometry(300, 300); 

你可以嘗試使用較低的密度,而不是爲300dpi。低密度更快:

settings.Density = new Density(72, 72); 

我認爲必須有另一種快速的方式來創建從PDF文件的圖像。 Magick.NET使用Ghostscript從pdf生成圖像,而Ghostscript速度很慢,有時不成功從複雜(分層)的pdf生成圖像。

相關問題