2013-05-27 26 views
1

我有一個非常高的asp圖表(PNG文件),比方說4000px的高度。當使用iTextSharp生成PDF文件時,它只有一個頁面,我只能看到我的圖表的25-30%。我不想縮放圖像以適合一個頁面。我想在多個頁面上展開/分割我的圖表,以便查看圖表的詳細信息。如果我的圖表適合四頁,PDF也需要四頁。 在下圖中,您可以看到我的圖表,我希望如何使用它(分佈在6頁上),以及iTextSharp(單個頁面上顯示的圖表頂部)生成的外觀。 ImageiTextSharp:C#圖像爲PDF - 在多個頁面上傳播大型asp圖表

Document pdfDoc = new Document(PageSize.A4.Rotate(), 10f, 10f, 10f, 0f); 
    PdfWriter.GetInstance(pdfDoc, Response.OutputStream); 
    pdfDoc.Open(); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     Chart1.SaveImage(stream, ChartImageFormat.Png); 
     iTextSharp.text.Image chartImage = iTextSharp.text.Image.GetInstance(stream.GetBuffer()); 
     chartImage.ScalePercent(70f);// This solves the width of the chart 
     pdfDoc.Add(chartImage); 
     pdfDoc.Close(); 

     Response.ContentType = "application/pdf"; 
     Response.AddHeader("content-disposition", "attachment;filename=Chart.pdf"); 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.Write(pdfDoc); 
     Response.End(); 
    } 

回答

5

您要創建具有橫向放置的A4頁面的文檔。這意味着您可以將圖像的寬度縮放到842pt,因此可以使用ScaleToFit(842f, 100000f);

請注意,我選擇100000f作爲任意高數字的高度。我只對寬度感興趣,因爲您想將圖像放在A4頁面上。

一旦你縮放圖像,你需要知道的縮放高度:chartImage.ScaledHeight;

假設這個高度是h。那麼你需要劃分h 595這就是你的網頁的高度。除非h是595的確切倍數,否則您需要使用(h/595) + 1頁面來顯示完整的圖表。

假設此值爲p(需要的頁數)。在這種情況下,您需要創建一個從1到p的循環,並添加相同的圖像並反覆觸發新頁面。

但是:添加圖像之前,你需要改變它的絕對位置:chartImage.setAbsolutePostion(0, (p - i) * 595);

我不知道如何寫C#(我是一個Java開發人員,實際上iText的原開發者),但我相信你可以用這個信息做一個例子。

+0

完美答案!謝謝布魯諾。 – user2416554

4

感謝布魯諾,這個解決方案拯救了我的一天。

Document pdfDoc = new Document(PageSize.A4.Rotate(), 10f, 10f, 10f, 0f); 
    PdfWriter.GetInstance(pdfDoc, Response.OutputStream); 
    pdfDoc.Open(); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     Chart1.SaveImage(stream, ChartImageFormat.Png); 
     iTextSharp.text.Image chartImage = iTextSharp.text.Image.GetInstance(stream.GetBuffer()); 
     chartImage.ScaleToFit(822f, 10000f); // 822 instead of 842 because I have 20f padding (10 + 10) at first line    
     int pageNbr = Convert.ToInt16(Math.Truncate(chartImage.ScaledHeight/595)); 
     int p = 0; 

     if (chartImage.ScaledHeight % 595 == 0) 
      p = pageNbr; 
     else 
      p = pageNbr + 1; 

     for (int i = 1; i <= p; i++) 
     { 
      pdfDoc.NewPage(); 
      chartImage.SetAbsolutePosition(10, -(p-i)*595); 
      pdfDoc.Add(chartImage); 

     } 
     pdfDoc.Close(); 

     Response.ContentType = "application/pdf"; 
     Response.AddHeader("content-disposition", "attachment;filename=Chart.pdf"); 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.Write(pdfDoc); 
     Response.End(); 
    } 
+0

很好的例子!謝謝! –