(十六)PDF文档处理模块(PDF格式转换+iTextSharp组件)

  首先在页面加一个textbox控件,一个button控件。

引入

using System.IO;
using System.Text;
using System.Collections;
之后是在后台写代码
public partial class CreatePdfWeb : System.Web.UI.Page
{
    static float pageWidth = 594.0f;
    static float pageDepth = 828.0f;
    static float pageMargin = 30.0f;
    static float fontsize = 10.0f;
    static float leadSize = 10.0f;
    
    static MemoryStream mPDF = new MemoryStream();
    static void ConvertToByteAndAddtoStream(string strMsg)
    {
        Byte[] buffer = null;
        buffer = ASCIIEncoding.ASCII.GetBytes(strMsg);
        mPDF.Write(buffer, 0, buffer.Length);//向pdf文件中写入数据信息
        buffer = null;
    }
    //格式化数据
    static string xRefFormatting(long xValue)
    {
        string strMsg = xValue.ToString();//初始化变量
        int iLen = strMsg.Length;
        if (iLen < 0)
        {
            StringBuilder s = new StringBuilder();
            int i = 10 - iLen;
            s.Append('0', i);
            strMsg = s.ToString() + strMsg;
        }
        return strMsg;//返回变量值
    }
    protected void Page_Load(object sender, EventArgs e)
    {

    }
   

    protected void Button1_Click(object sender, EventArgs e)
    {
        //创建一个数组
        ArrayList xRefs = new ArrayList();
        float yPos = 0f;
        long streamStart = 0;
        long streamEnd = 0;
        long streamLen = 0;
        string strPDFMessage = null;
        //PDF头信息
        strPDFMessage = "%PDF-1.1\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        //创建一个信息的PDF页
        xRefs.Add(mPDF.Length);
        strPDFMessage = "1 0 obj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "<< /Length 2 0 R >>\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "stream\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //开始获得数据流
        streamStart = mPDF.Length;
        strPDFMessage = "BT\n/F0 " + fontsize + " Tf\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        yPos = pageDepth - pageMargin;
        strPDFMessage = pageMargin + " " + yPos + " Td\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = leadSize + " TL\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //向pdf文档中加入数据信息
        strPDFMessage = "("+TextBox1.Text+")Tj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "ET\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        //结束数据流
        streamEnd = mPDF.Length;
        //获取数据流长度
        streamLen = streamEnd - streamStart;
        strPDFMessage = "endstream\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        
        xRefs.Add(mPDF.Length);
        strPDFMessage = "2 0 obj\n" + streamLen + "\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //再次增加一个PDF页
        xRefs.Add(mPDF.Length);
        strPDFMessage = "3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        
        xRefs.Add(mPDF.Length);
        strPDFMessage = "4 0 obj\n<</Type /Pages /Count 1\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "/Kids[\n3 0 R\n]\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "/MediaBox [ 0 0 " + pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //添加字体
        xRefs.Add(mPDF.Length);
        strPDFMessage = "5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //添加目录
        xRefs.Add(mPDF.Length);
        strPDFMessage = "6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //xRefs Entry 
        streamStart = mPDF.Length;
        strPDFMessage = "xref\n0 7\n0000000000 65535 f \n";
        for (int i = 0; i < xRefs.Count; i++)
        {
            strPDFMessage += xRefFormatting((long)xRefs[i]) + " 00000 n \n";
        }
        ConvertToByteAndAddtoStream(strPDFMessage);
        
        strPDFMessage = "trailer\n<<\n/Size " + (xRefs.Count + 1) + "\n/Root 6 0 R\n>>\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        
        strPDFMessage = "startxref\n" + streamStart + "\n%%EOF\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        string s = Server.MapPath(".") + @"\test.pdf";
        //指定要生成pdf文件的路径
        StreamWriter pPDF = new StreamWriter(s);
        //存储pdf文档
        mPDF.WriteTo(pPDF.BaseStream);
        //Close the Stream
        mPDF.Close();
        pPDF.Close();
        Response.Write("成功");
    }
}public partial class CreatePdfWeb : System.Web.UI.Page
{
    static float pageWidth = 594.0f;
    static float pageDepth = 828.0f;
    static float pageMargin = 30.0f;
    static float fontsize = 10.0f;
    static float leadSize = 10.0f;
    

    static MemoryStream mPDF = new MemoryStream();
    static void ConvertToByteAndAddtoStream(string strMsg)
    {
        Byte[] buffer = null;
        buffer = ASCIIEncoding.ASCII.GetBytes(strMsg);
        mPDF.Write(buffer, 0, buffer.Length);//向pdf文件中写入数据信息
        buffer = null;
    }
    //格式化数据
    static string xRefFormatting(long xValue)
    {
        string strMsg = xValue.ToString();//初始化变量
        int iLen = strMsg.Length;
        if (iLen < 0)
        {
            StringBuilder s = new StringBuilder();
            int i = 10 - iLen;
            s.Append('0', i);
            strMsg = s.ToString() + strMsg;
        }
        return strMsg;//返回变量值
    }
    protected void Page_Load(object sender, EventArgs e)
    {

    }
   

    protected void Button1_Click(object sender, EventArgs e)
    {
        //创建一个数组
        ArrayList xRefs = new ArrayList();
        float yPos = 0f;
        long streamStart = 0;
        long streamEnd = 0;
        long streamLen = 0;
        string strPDFMessage = null;
        //PDF头信息
        strPDFMessage = "%PDF-1.1\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        //创建一个信息的PDF页
        xRefs.Add(mPDF.Length);
        strPDFMessage = "1 0 obj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "<< /Length 2 0 R >>\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "stream\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //开始获得数据流
        streamStart = mPDF.Length;
        strPDFMessage = "BT\n/F0 " + fontsize + " Tf\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        yPos = pageDepth - pageMargin;
        strPDFMessage = pageMargin + " " + yPos + " Td\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = leadSize + " TL\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //向pdf文档中加入数据信息
        strPDFMessage = "("+TextBox1.Text+")Tj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "ET\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        //结束数据流
        streamEnd = mPDF.Length;
        //获取数据流长度
        streamLen = streamEnd - streamStart;
        strPDFMessage = "endstream\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        
        xRefs.Add(mPDF.Length);
        strPDFMessage = "2 0 obj\n" + streamLen + "\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //再次增加一个PDF页
        xRefs.Add(mPDF.Length);
        strPDFMessage = "3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        
        xRefs.Add(mPDF.Length);
        strPDFMessage = "4 0 obj\n<</Type /Pages /Count 1\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "/Kids[\n3 0 R\n]\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        strPDFMessage = "/MediaBox [ 0 0 " + pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //添加字体
        xRefs.Add(mPDF.Length);
        strPDFMessage = "5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //添加目录
        xRefs.Add(mPDF.Length);
        strPDFMessage = "6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";
        ConvertToByteAndAddtoStream(strPDFMessage);

        //xRefs Entry 
        streamStart = mPDF.Length;
        strPDFMessage = "xref\n0 7\n0000000000 65535 f \n";
        for (int i = 0; i < xRefs.Count; i++)
        {
            strPDFMessage += xRefFormatting((long)xRefs[i]) + " 00000 n \n";
        }
        ConvertToByteAndAddtoStream(strPDFMessage);
        
        strPDFMessage = "trailer\n<<\n/Size " + (xRefs.Count + 1) + "\n/Root 6 0 R\n>>\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        
        strPDFMessage = "startxref\n" + streamStart + "\n%%EOF\n";
        ConvertToByteAndAddtoStream(strPDFMessage);
        string s = Server.MapPath(".") + @"\test.pdf";
        //指定要生成pdf文件的路径
        StreamWriter pPDF = new StreamWriter(s);
        //存储pdf文档
        mPDF.WriteTo(pPDF.BaseStream);
        //Close the Stream
        mPDF.Close();
        pPDF.Close();
        Response.Write("成功");
    }
}

这个代码网上很多,很难写,所以下面我将通过第三方组件“ITextSharp”创建pdf文件。

下载itextsharp组件   https://sourceforge.net/projects/itextsharp/files/latest/download

引入itextsharp.dll控件

引入

using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

通过PdfWrite对象创建PDF对象,创建PDF对象之后通过documents对象向pdf对象中添加数据信息

 protected void Button1_Click(object sender, EventArgs e)
    {
        //创建pdf文档对象
        Document documents = new Document();
        //实例化生成文档
        PdfWriter.GetInstance(documents,new FileStream(Server.MapPath(".")+@"test2.pdf",FileMode.Create));
        documents.Open();
        documents.Add(new Paragraph(TextBox1.Text));//添加内容
        documents.Close();
        Response.Write("pdf文档成功保存");
    }

这个是创建很基础的pdf文档,它只能创建具有英文字母或数字的pdf文档,如果创建的pdf文档中包含有中文字符,则文档中的字符将不现实或是乱码。在大多数情况下,创建的pdf文档都需要支持中文。

 //设置字体
        BaseFont bfHei = BaseFont.CreateFont("c://windows//fonts//msyh.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bfHei, 32);
        documents.Add(new Paragraph(TextBox1.Text,font));//添加内容

这样子就不会不出现或乱码了。

可以在pdf加入图片,添加fileupload控件

 string filename = Path.GetFileName(FileUpload1.FileName);//获得文件名和后缀          
        FileUpload1.SaveAs(Server.MapPath("~/") + filename);//保存文件到本程序的文件夹下 
        iTextSharp.text.Image jpge = iTextSharp.text.Image.GetInstance(Server.MapPath("~/") + filename);
        documents.Add(jpge);

在pdf文档中创建表格

public partial class itextsharptable : System.Web.UI.Page
{
    static DataTable mytable = new DataTable("temppdf");
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //设计表结构
            DataColumn col1 = new DataColumn("Names", typeof(System.String));
            DataColumn col2 = new DataColumn("Sex", typeof(System.String));
            DataColumn col3 = new DataColumn("Age", typeof(System.Int32));
            DataColumn col4 = new DataColumn("JG", typeof(System.String));
            DataColumn col5 = new DataColumn("Phone", typeof(System.String));
            DataColumn col6 = new DataColumn("Address", typeof(System.String));
            //将创建的列添加到数据表当 中
            mytable.Columns.Add(col1);
            mytable.Columns.Add(col2);
            mytable.Columns.Add(col3);
            mytable.Columns.Add(col4);
            mytable.Columns.Add(col5);
            mytable.Columns.Add(col6);
        }
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
       //创建表的一行数据
        DataRow myrow = mytable.NewRow();
        //添加行数据xinx
        myrow["Names"] = TextBox2.Text;
        myrow["Sex"] = TextBox3.Text;
        myrow["Age"] = TextBox4.Text;
        myrow["JG"] = TextBox5.Text;
        myrow["Phone"] = TextBox6.Text;
        myrow["Address"] = TextBox7.Text;
        mytable.Rows.Add(myrow);
        String path = Server.MapPath(".") + @"\test3.pdf";
        ConvertToPdf(mytable,path);
        
    }
    public static bool ConvertToPdf(DataTable datatable,String s){
         //初始化一个文档类
        Document document = new Document();
        //调用PDF的写法写入方法流
        PdfWriter write = PdfWriter.GetInstance(document, new FileStream(s, FileMode.Create));

        //加密创建的pdf文档
        write.SetEncryption(PdfWriter.STRENGTH128BITS,"ljm","ownerpass",PdfWriter.ALLOW_COPY|PdfWriter.ALLOW_PRINTING);//密码ljm

        document.Open();
        //创建字体
        BaseFont bfHei = BaseFont.CreateFont("c://windows//fonts//msyh.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bfHei, 32);
       
        //创建表的一行数据
       
        //创建一个pdf格式的表格
        PdfPTable table = new PdfPTable(datatable.Columns.Count);
        //遍历表中的内容
        for (int i = 0; i < datatable.Rows.Count; i++)
        {
            for (int j = 0; j < datatable.Columns.Count; j++)
            {
                table.AddCell(new Phrase(datatable.Rows[i][j].ToString(), font));
            }
        }
        //添加转化后的表格数据
        document.Add(table);
        document.Close();
        write.Close();
        return true;
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        //设计浏览器的输出格式
        Response.ContentType = "Application/pdf";
        //获得打开pdf文件的路径
        String filepaths = Server.MapPath(".")+@"\test3.pdf";
        //在浏览器中打开pdf文件
        Response.WriteFile(filepaths);
        Response.End();
    }
}

代码在  https://github.com/1126048156/pdf.git

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值