[英]iTextSharp: C# image to PDF - Spread big asp chart on more than one page
我有一個非常高的asp圖表(PNG文件),假設高度為4000px。 使用iTextSharp生成pdf文件時,它只有一頁,我只能看到圖表的25-30%。 我不想縮放圖像以適合一頁。 我想在多個頁面上分散/拆分圖表,以便查看圖表的詳細信息。 如果我的圖表適合四頁,則PDF也需要四頁。 在下面的圖像中,您可以看到我的圖表,我想要的圖表(分布在6頁上)以及它的外觀(由iTextSharp生成)(圖表的頂部顯示在一頁上)。 圖片
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();
}
您正在使用橫向A4頁面創建文檔。 這意味着您可以將圖像的寬度縮放到842pt,因此可以使用ScaleToFit(842f, 100000f);
來代替ScalePercent(70f)
ScaleToFit(842f, 100000f);
請注意,我選擇100000f
作為高度的任意高數。 我只對寬度感興趣,因為您想使圖像適合A4頁面。
縮放圖像后,您需要知道縮放的高度: chartImage.ScaledHeight;
假設這個高度是h
。 然后,您需要將h
除以595。這就是頁面的高度。 除非h
是595的精確倍數,否則ou將需要(h / 595) + 1
頁才能顯示完整圖表。
假設此值為p
(必需的頁數)。 在這種情況下,您需要創建一個從1到p的循環,並添加相同的圖像並一次又一次觸發新頁面。
但是:在添加圖像之前,您需要更改其絕對位置: chartImage.setAbsolutePostion(0, (p - i) * 595);
我不知道如何編寫C#(我是Java開發人員,實際上是iText的原始開發人員),但是我敢肯定,您可以使用此信息編寫示例。
感謝Bruno,這個解決方案挽救了我的一天。
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.