C#使用itextsharp生成PDF文件的实现代码

项目需求需要生成一个PDF文档,使用的是VS2010,ASP.NET。
网络上多次搜索没有自己想要的,于是硬着头皮到itextpdf官网看英文文档,按时完成任务,以实用为主,共享一下:
使用HTML文件创建PDF模板:
使用自定义字体的一种方法:


代码如下:

FontFactory.Register(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\Fonts\\RAGE.TTF", "myFont");
                Font myFont = FontFactory.GetFont("myFont");
                BaseFont bf = myFont.BaseFont;

其中RAGE.TTF是微软操作系统自带的字体,目录在C:\Windows\Fonts,建议将需要的字体拷贝到项目中使用,否则会出现引用不到的情况。
使用自定义样式:


代码如下:

StyleSheet css = new StyleSheet();
                Dictionary<String, String> dict= new Dictionary<string, string>();
                dict.Add(HtmlTags.BGCOLOR, "#01366C");
                dict.Add(HtmlTags.COLOR, "#000000");
                dict.Add(HtmlTags.SIZE,"25");
                css.LoadStyle("css1", dict);

这里既可以使用了StyleSheet的LoadStyle方法。
注意itextsharp对HTML元素的支持很弱,像label、div等元素的对齐、背景颜色等属性支持不好,建议使用table标签。
重写Font的GetFont方法:


代码如下:

public  class MyFontFactory : IFontProvider
        {
            public  Font GetFont(String fontname,String encoding, Boolean embedded, float size,int style, BaseColor color)
            {
                if (fontname == "微软雅黑")
                {
                    string fontpath = System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\Fonts\\MSYH.ttf";
                    BaseFont bf3 = BaseFont.CreateFont(fontpath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                    Font fontContent = new Font(bf3,size,style,color);
                    return fontContent;
                }
                else {
                    Font fontContent = FontFactory.GetFont(fontname, size, style, color);
                    return fontContent;
                }
            }
            public  Boolean IsRegistered(String fontname)
            {
                return false;
            }
        }

这里要想使用自定义字体需要继承IFontProvider接口,并重写Font的GetFont方法。
将自定义字体和样式表加入到文档:


代码如下:

Dictionary<String, Object> font = new Dictionary<string, object>();
                font.Add(HTMLWorker.FONT_PROVIDER,new MyFontFactory());

List<IElement> p = HTMLWorker.ParseToList(new StreamReader(html), css,font);

使用PdfContentByte为元素加背景颜色:


代码如下:

PdfContentByte pcb = writer.DirectContentUnder;
                pcb.SetRGBColorFill(0, 255, 0);
                pcb.SetRGBColorFill(1, 54, 108);
                pcb.Rectangle(20, 413, 800, 42);
                pcb.Fill();

缺点显而易见,就是需要绝对坐标,小弟学疏才浅,再加时间紧迫,只能如此。如果大牛知道更好的方法,还望不吝赐教。
完整代码:


代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using iTextSharp.text.pdf;
using iTextSharp.text;
using System.IO;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.html;
/// <summary>
///CreatePDF 的摘要说明
/// </summary>
namespace WSE.LCPI
{
    public class CreatePDF
    {
        public CreatePDF()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }
       public  class MyFontFactory : IFontProvider
        {
            public  Font GetFont(String fontname,String encoding, Boolean embedded, float size,int style, BaseColor color)
            {
                if (fontname == "微软雅黑")
                {
                    string fontpath = System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\LCPI\\Fonts\\MSYH.ttf";
                    BaseFont bf3 = BaseFont.CreateFont(fontpath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                    Font fontContent = new Font(bf3,size,style,color);
                    return fontContent;
                }
                else {
                    Font fontContent = FontFactory.GetFont(fontname, size, style, color);
                    return fontContent;
                }
            }
            public  Boolean IsRegistered(String fontname)
            {
                return false;
            }
        }
        /// <summary>
        /// 生成PDF
        /// </summary>
        /// <param name="html"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static Boolean HTMLToPDF(string html, String fileName)
        {
            Boolean isOK = false;
            try
            {
                TextReader reader = new StringReader(html);
                // step 1: creation of a document-object
                Document document = new Document(PageSize.A4.Rotate(), 30, 30, 30, 30);
                // step 2:
                // we create a writer that listens to the document
                // and directs a XML-stream to a file
                fileName = System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\PDF\\" + fileName+".pdf";
              FileStream fs=new FileStream(fileName, FileMode.Create,FileAccess.Write,FileShare.ReadWrite);
                PdfWriter writer = PdfWriter.GetInstance(document,fs );
                HTMLWorker worker = new HTMLWorker(document);
                document.Open();
                worker.StartDocument();
                StyleSheet css = new StyleSheet();
                Dictionary<String, Object> font = new Dictionary<string, object>();
                font.Add(HTMLWorker.FONT_PROVIDER,new MyFontFactory());
                Dictionary<String, String> dict= new Dictionary<string, string>();
                dict.Add(HtmlTags.BGCOLOR, "#01366C");
                dict.Add(HtmlTags.COLOR, "#000000");
                dict.Add(HtmlTags.SIZE,"25");
                css.LoadStyle("css", dict);

List<IElement> p = HTMLWorker.ParseToList(new StreamReader(html), css,font);
                for (int k = 0; k < p.Count; k++)
                {
                    document.Add((IElement)p[k]);
                }
                PdfContentByte pcb = writer.DirectContentUnder;
                pcb.SetRGBColorFill(0, 255, 0);
                pcb.SetRGBColorFill(1, 54, 108);
                pcb.Rectangle(20, 413, 800, 42);
                pcb.Fill();
                worker.EndDocument();
                worker.Close();              
                document.Close();
                reader.Close();
                isOK = true;
            }
            catch (Exception ex)
            {
                isOK = false;
            }
            finally {

}
            return isOK;
        }
    }
}

(0)

相关推荐

  • C#使用doggleReport生成pdf报表的方法

    本文实例讲述了C#使用doggleReport生成pdf报表的方法.分享给大家供大家参考,具体如下: 1. 安装nuget -install package DoddleReport -install package DoddleReport.iTextSharp 2. 实例代码 static void Main(string[] args) { var query = GetAll(); var report = new Report(query.ToReportSource()); repo

  • C#将jpg转换为pdf的方法

    本文实例讲述了C#将jpg转换为pdf的方法.分享给大家供大家参考.具体实现方法如下: C#生成pdf文件需要使用到一个itextsharp.dll文件,itextsharp.dll是一个开源的在C#中用来生成PDF文档的库文件,下面我们来给大家介绍利用itextsharp来生成库文件. 介绍 PDF生成所需类库itextsharp.dll,是一个开源的在C#中用来生成PDF文档的库文件,不少C#爱好者用它制作出了PDF文档生成器 具体代码如下: 复制代码 代码如下: void ConvertJ

  • C#获取指定PDF文件页数的方法

    本文实例讲述了C#获取指定PDF文件页数的方法.分享给大家供大家参考.具体如下: using System; using System.IO; using System.Text.RegularExpressions; using System.Windows.Forms; namespace RobvanderWoude { class PDFPageCount { static int Main( string[] args ) { #region Get help if ( args.Le

  • C#生成PDF文件流

    本文实例为大家分享了C#生成PDF文件流的具体代码,供大家参考,具体内容如下 1.设置字体 static BaseFont FontBase = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); static iTextSharp.text.Font bodyFont = new iTextSharp.text.Font(FontBase, 12)

  • c#实现将pdf转文本的示例分享

    如何解析PDF文件 在.NET中从PDF文件里提取文本的几种主要方法有: 1.Microsoft 的 IFilter 接口 和 Adobe 的 IFilter 实现: 2.iTextSharp: 3.PDFBox. 不幸的是这些 PDF 解析方案都不完美.我们将在下面讨论这些方法. Adobe PDF IFilter 为了使用 IFilter 接口来解析 PDF 文件,你需要: Windows 2000 或者后续版本 Adobe Acrobat 或 Reader 7.0.5+ (或单独的 Ado

  • 用C#来解析PDF文件

    1. 介绍 这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项目基于"PDF指南,第六版,Adobe便携文档格式1.7 2006年11月". 它是一个恐怕有1310页的大部头. 本文提供了对这份文档的简洁概述. 与此相关的项目定义了用来读取和解析PDF文件的C#类. 为了测试这些类,附带的测试程序PdfFileAnalyzer让你可以去读取一个PDF文件,分析它并展示和保存结果. 程序将PDF文件分割成单独

  • C#实现TIF图像转PDF文件的方法

    本文实例讲述了C#实现TIF图像转PDF文件的方法.分享给大家供大家参考.具体实现方法如下: 这里介绍使用TIFtoPDF的用法.该工具可以将多个TIF图像文件合并成一个PDF文件 TIFtoPDF.rar文件点击此处本站下载. Program.cs文件如下: using System; using System.Collections.Generic; using System.IO; using iTextSharp.text; using iTextSharp.text.pdf; usi

  • C#实现pdf导出 .Net导出pdf文件

    最近碰见个需求需要实现导出pdf文件,上网查了下代码资料总结了以下代码.可以成功的实现导出pdf文件. 在编码前需要在网上下载个itextsharp.dll,此程序集是必备的.楼主下载的是5.0版本,之前下了个5.4的似乎不好用. 下载之后直接添加引用. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Webpdf.aspx.cs" Inherits="Web导出

  • C#实现HTML转WORD及WORD转PDF的方法

    本文实例讲述了C#实现HTML转WORD及WORD转PDF的方法.分享给大家供大家参考.具体如下: 功能:实现HTML转WORD,WORD转PDF 具体代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; usi

  • C# 生转换网页为pdf

    从htm生成pdf大概可以分两步实现,第一步,解析htm,就是将htm源文件中那一对文本转换为浏览器最终呈现给我们那种图文并茂的结果.这是一个不可完成的任务,因为目前为止业界的软件巨头也没有谁把htm解析做得很好的.对比ie.firefox等浏览器的显示结果便可想而知.既然业界难题,我也就不去钻牛角尖做技术攻关了,先跳过这步,考虑下一步的事情. 第二步,绘制pdf,这个简单,网上有很多资料,有兴趣的朋友可以研究 pdf的文件格式,安装二进制组装pdf.我有兴趣,然而没有时间,我觉得软件从业者时刻

随机推荐