透過程式直接將Text內容轉換成PDF的程式範例,寫來給其他組同事做為系統整合模組開發參考,順便PO文備忘。

要在.NET轉PDF,當然少不了大家都說讚的iTextSharp,程式很簡單,我還順手加了一個遇到"\f" (0x0C) Form Feed符號就強制換新頁的功能。

<%@ Page Language="C#" %>
<%@ Import Namespace="iTextSharp.text" %>
<%@ Import Namespace="iTextSharp.text.pdf" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
    protected void btnConvert_Click(object sender, EventArgs e)
    {
//REF: http://www.codeproject.com/KB/graphics/iTextSharpTutorial.aspx
        Document doc = new Document(PageSize.A4.Rotate());
        
        using (MemoryStream ms = new MemoryStream())
        {
 
            try
            {
                PdfWriter.GetInstance(doc, ms);
                doc.Open();
//中文字型問題REF 
//http://renjin.blogspot.com/2009/01/using-chinese-fonts-in-itextsharp.html
                string fontPath = 
                    Environment.GetFolderPath(
                    Environment.SpecialFolder.System) +
                    @"\..\Fonts\kaiu.ttf";
                BaseFont bfChinese = BaseFont.CreateFont(
                    fontPath,
                    BaseFont.IDENTITY_H, //橫式中文
                    BaseFont.NOT_EMBEDDED
                );
                Font fontChinese = new Font(bfChinese, 8f, Font.NORMAL);
                
                StringReader sr = new StringReader(txtInput.Text);
                string line = null;
                while ((line = sr.ReadLine()) != null)
                {
                    string[] p = line.Split('\f');
                    foreach (string s in p)
                    {
                        doc.Add(new Paragraph(s, fontChinese));
                        if (p.Length > 1) //表示有換頁符號
                            doc.NewPage();
                    }
                }
            }
            catch (DocumentException de)
            {
                Response.Write(de.Message);
                Response.End();
            }
            catch (IOException ioe)
            {
                Response.Write(ioe.Message);
                Response.End();
            }
            doc.Close();
            //Output PDF
            Response.Clear();
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("content-disposition", 
                "attachment;filename=output.pdf");
            Response.BinaryWrite(ms.ToArray());
            Response.End();
        }
                    
    }
</script>
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Text to PDF demo</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="txtInput" runat="server" Height="600px" TextMode="MultiLine" 
            Width="800px"></asp:TextBox>
    <br /><asp:Button ID="btnConvert" runat="server" onclick="btnConvert_Click" 
            Text="Convert to PDF" />
    </div>
    </form>
</body>
</html>

Comments

# by lsk

五點還沒到,黑大你就已經在未來先PO文囉~~

# by topcat

來自未來的訊息!!

# by Han

請問如果轉出內容是HTML格式,要如何呈現呢?

# by Alex

iTextSharp 5.0 以後採用 AGPL 授權 黑大 有改用其他 nuget package 嗎? 或是購買 commercial license ?

# by Jeffrey

to Alex,我的理解,若限定企業內部使用,完全不對外提供服務,應該還是可行(如有錯請指正)。參考:https://opensource.stackexchange.com/a/7229

Post a comment