iT邦幫忙

0

ASP.NET C# itextsharp 使用問題 _已解決

大大們好 想請問有用過itextsharp的前輩還請分享點經驗跟方法
目前把Gridview的資料輸出成PDF如下圖
https://ithelp.ithome.com.tw/upload/images/20180411/2010744494Df5rIM9w.jpg
目前想做成如果Gridview的欄位有True值的話
就把紅色金探號顯示Gridview欄位的左邊,如下圖
https://ithelp.ithome.com.tw/upload/images/20180411/20107444feiNbhIcZH.jpg
不知道有沒有方法可行 @@
還是說要用itextsharp watermark的方法??

您的表格是需要動態產生嗎,
還是可以事先做好範本,在隱藏或顯示驚嘆號?
小火車 iT邦新手 4 級 ‧ 2018-04-12 08:34:45 檢舉
表格不是動態產生
大大說的事先做好範本的意思是??
我不太懂 @@
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
小碼農米爾
iT邦高手 1 級 ‧ 2018-04-12 13:25:58
最佳解答

我做了一個 PDF 套版的範例給您參考看看,結果如下圖。
https://ithelp.ithome.com.tw/upload/images/20180412/20106865qZhNVQ9D8P.jpg

首先製作範本檔:
左邊利用 Button 元件的背景圖來顯示驚嘆號,右邊為文字欄位。

https://ithelp.ithome.com.tw/upload/images/20180412/20106865GJGmlQ0Knf.jpg

接著利用程式套入資料:
程式判斷資料為 True 就顯示圖片。

//測試資料
var dataList = new List<Data>
{
    new Data {  isTrue = true },
    new Data {  isTrue = false },
    new Data {  isTrue = true },
};

var basePath = AppDomain.CurrentDomain.BaseDirectory;

//範本檔路徑
var template = $"{basePath}template.pdf";

var output = null as byte[];

using (var stream = new MemoryStream())
{
    using (var reader =
        new iTextSharp.text.pdf.PdfReader(template))
    {
        using (var stamper =
            new iTextSharp.text.pdf.PdfStamper(reader, stream))
        {
            //加入字型
            var baseFont = iTextSharp.text.pdf.BaseFont.CreateFont(
                @"C:\windows\fonts\arial.ttf",
                iTextSharp.text.pdf.BaseFont.IDENTITY_H,
                iTextSharp.text.pdf.BaseFont.EMBEDDED);
            stamper.AcroFields.AddSubstitutionFont(baseFont);

            //取得表單
            var form = stamper.AcroFields;

            for (var i = 0; i < dataList.Count; i++)
            {
                var item = dataList[i];

                //套入文字
                form.SetField($"Text{(i + 1)}", item.isTrue.ToString());
                //套入圖片
                if (item.isTrue)
                {
                    var image = iTextSharp.text.Image.GetInstance(
                        $"{basePath}image.jpg");
                    var pushbuttonField = 
                        form.GetNewPushbuttonFromField($"Button{(i + 1)}");
                    pushbuttonField.Layout = 
                        iTextSharp.text.pdf.PushbuttonField.LAYOUT_ICON_ONLY;
                    pushbuttonField.ProportionalIcon = true;
                    pushbuttonField.Image = image;
                    form.ReplacePushbuttonField(
                        $"Button{(i + 1)}", pushbuttonField.Field);
                }
            }

            stamper.FormFlattening = true;
        }
    }
    output = stream.ToArray();
}

//另存 PDF
using (var fs = File.Create($"{basePath}newPdf.pdf"))
{
    fs.Write(output, 0, output.Length);
}

詳細的 PDF 套版說明可以參考這篇 文章

小火車 iT邦新手 4 級 ‧ 2018-04-16 18:01:10 檢舉

很感謝大大的幫忙 原來還可以用套版的

哈哈哈,是阿
如果不是需要動態產生的報表,
基本上我都會用套板的,
開發快速,且不怕客戶亂改格式...

我要發表回答

立即登入回答