簡體   English   中英

iTextSharp:將C#圖片轉換為PDF-在多個頁面上展開大asp圖表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM