namespace Frame.ITextSharp
{
    /// <summary>
    /// iTextSharp导出数据源到PDF
    /// </summary>
    public static class ITextSharp_PDFHelper
    {
        /// <summary>
        /// 导出Pdf
        /// </summary>
        /// <param name="localFilePath">文件保存路径</param>
        /// <param name="dtSource">数据源</param>
        /// <param name="HorV">页面横竖(为空表示竖,有非空值为横)</param>
        public static void ExportPDF(string localFilePath, DataTable dtSource, string HorV)
        {
            iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsian.dll");
            iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsianCmaps.dll");
            BaseFont bf;
            string basepath = Application.StartupPath;
            try
            {
                bf = BaseFont.CreateFont(basepath + "\\FONTS\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
            catch
            {
                bf = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
            iTextSharp.text.Font font = new iTextSharp.text.Font(bf);
            iTextSharp.text.Document pdf;
            if (string.IsNullOrEmpty(HorV))
            {
                pdf = new iTextSharp.text.Document();
            }
            else
            {
                pdf = new iTextSharp.text.Document(PageSize.A4.Rotate());
            }

PdfPTable table = new PdfPTable(dtSource.Columns.Count);
            table.HorizontalAlignment = Element.ALIGN_CENTER;
            PdfPCell cell;
            for (int i = 0; i < dtSource.Rows.Count + 1; i++)
            {
                for (int j = 0; j < dtSource.Columns.Count; j++)
                {
                    if (i == 0)
                    {
                        cell = new PdfPCell(new Phrase(dtSource.Columns[j].ColumnName, font));
                    }
                    else
                    {
                        cell = new PdfPCell(new Phrase(dtSource.Rows[i - 1][j].ToString(), font));
                    }

table.AddCell(cell);
                }
            }
            using (FileStream fs = new FileStream(localFilePath, FileMode.Create, FileAccess.Write))
            {

PdfWriter.GetInstance(pdf, fs);
                pdf.Open();
                pdf.Add(table);
                pdf.Close();
            }
        }

/// <summary>
        /// 提取PDF文件的文本内容
        /// </summary>
        /// <param name="pdfFilepath"></param>
        /// <returns></returns>
        public static string ReadPdfContent(string pdfFilepath)
        {
            try
            {
                PdfReader pdfReader = new PdfReader(pdfFilepath);
                int numberOfPages = pdfReader.NumberOfPages;
                string pfdText = string.Empty;
                for (int i = 1; i <= numberOfPages; ++i)
                {
                    //ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                    //pfdText += PdfTextExtractor.GetTextFromPage(pdfReader, i, strategy);
                    byte[] bufferOfPageContent = pdfReader.GetPageContent(i);
                    pfdText += Encoding.UTF8.GetString(bufferOfPageContent);
                }
                pdfReader.Close();
                return pfdText;
            }
            catch
            {
                return string.Empty;
            }
        }

/// <summary>
        /// 添加倾斜水印
        /// </summary>
        /// <param name="pdfStream">pdf文件流</param>
        /// <param name="iTextSharpTextWaterMarkPara">水印参数</param>
        public static MemoryStream SetPdfTextWaterMark(MemoryStream pdfStream, ITextSharpTextWaterMarkPara iTextSharpTextWaterMarkPara)
        {
            try
            {
                int span = 40;//设置垂直位移
                MemoryStream outStream = new MemoryStream();
                PdfReader pdfReader = new PdfReader(pdfStream);
                PdfStamper pdfStamper = new PdfStamper(pdfReader, outStream);
                pdfStamper.Writer.CloseStream = false;
                int total = pdfReader.NumberOfPages + 1;
                PdfContentByte content;
                BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\STCAIYUN.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);//华文云彩字体
                PdfGState gs = new PdfGState();
                gs.FillOpacity = iTextSharpTextWaterMarkPara.Alpha;//透明度
                int waterMarkNameLenth = iTextSharpTextWaterMarkPara.WaterMarkText.Length;
                char c;
                int rise = 0;
                string spanString = " ";//水平位移
                for (int i = 1; i < total; i++)
                {
                    rise = waterMarkNameLenth * span;
                    content = pdfStamper.GetOverContent(i);//在内容上方加水印
                    //content = pdfStamper.GetUnderContent(i);//在内容下方加水印
                    content.SetGState(gs);
                    content.BeginText();
                    content.SetColorFill(BaseColor.GREEN);
                    content.SetFontAndSize(font, iTextSharpTextWaterMarkPara.FontSize);
                    int heightNumbert = (int)Math.Ceiling((decimal)iTextSharpTextWaterMarkPara.Height / (decimal)rise);//垂直重复的次数,进一发
                    int panleWith = (iTextSharpTextWaterMarkPara.FontSize + span) * waterMarkNameLenth;
                    int widthNumber = (int)Math.Ceiling((decimal)iTextSharpTextWaterMarkPara.Width / (decimal)panleWith);//水平重复次数

// 设置水印文字字体倾斜 开始
                    for (int w = 0; w < widthNumber; w++)
                    {
                        for (int h = 1; h <= heightNumbert; h++)
                        {
                            int yleng = rise * h;
                            content.SetTextMatrix(w * panleWith, yleng);//x,y设置水印开始的绝对左边,以左下角为x,y轴的起点
                            for (int k = 0; k < waterMarkNameLenth; k++)
                            {
                                content.SetTextRise(yleng);//指定的y轴值处添加
                                c = iTextSharpTextWaterMarkPara.WaterMarkText[k];
                                content.ShowText(c + spanString);
                                yleng -= span;
                            }
                        }
                    }
                    content.EndText();
                }
                if (pdfStamper != null)
                    pdfStamper.Close();

if (pdfReader != null)
                    pdfReader.Close();

return outStream;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

/// <summary>
    ///
    /// </summary>
    public class ITextSharpTextWaterMarkPara
    {
        /// <summary>
        ///
        /// </summary>
        public ITextSharpTextWaterMarkPara()
        {
            Width = 0;
            Height = 0;
            XCoordinate = 0;
            YCoordinate = 0;
        }

/// <summary>
        /// 水印文本
        /// </summary>
        public string WaterMarkText { get; set; }

/// <summary>
        /// 透明度:0,10%,20%。。。。。90%,100%
        /// 0,0.1f,0.2f,。。。。。0.9f,1
        /// </summary>
        public float Alpha { get; set; }

/// <summary>
        /// 旋转度数
        /// </summary>
        public float RotateDegree { get; set; }

/// <summary>
        /// 字体大小
        /// </summary>
        public int FontSize { get; set; }

/// <summary>
        /// PDF的左边距离
        /// </summary>
        public float Width { get; set; }

/// <summary>
        /// PDF的上边距离
        /// </summary>
        public float Height { get; set; }

/// <summary>
        /// X坐标
        /// </summary>
        public float XCoordinate { get; set; }

/// <summary>
        /// Y坐标
        /// </summary>
        public float YCoordinate { get; set; }
    }
}

C#&.Net干货分享- iTextSharp导出数据源到PDF的更多相关文章

  1. C#&.Net干货分享- 构建Spire-Office相关Helper操作Word、Excel、PDF等

    先下载好如下的组件: 直接使用完整源码分享: namespace Frame.Office{    /// <summary>    /// Spire_WordHelper    /// ...

  2. ITextSharp导出PDF表格和图片(C#)

    文章主要介绍使用ITextSharp导出PDF表格和图片的简单操作说明,以下为ITextSharp.dll下载链接 分享链接:http://pan.baidu.com/s/1nuc6glj 密码:3g ...

  3. 干货分享:SQLSERVER使用裸设备

    干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...

  4. iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ②)

    距上一篇博客"APP引导页的高度集成 - DHGuidePageHUD - ①"的发布有一段时间了, 后来又在SDK中补充了一些新的内容进去但是一直没来得及跟大家分享, 今天来跟大 ...

  5. iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ①)

    好长时间没更新博客, 是时候来一波干货分享了;APP引导页话不多说每一个APP都会用到,分量不重但是不可缺少,不论是APP的首次安装还是版本的更新,首先展现给用户眼前的也就只有它了吧,当然这里讲的不是 ...

  6. 【干货分享】Google 的设计准则,素材和资源

    在谷歌,他们说, “专注于用户,所有其它的就会水到渠成 ”.他们遵循设计原则,寻求建立让用户惊喜的用户体验.谷歌一直挑战自己,为他们的用户创造一种视觉语言,综合优秀设计的经典原则和创新.谷歌设计规范是 ...

  7. 【干货分享】Node.js 中文资料导航

    这篇文章与大家分享一批高质量的的 Node.js 中文资料.Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用 Node ...

  8. 干货分享:MySQL之化险为夷的【钻石】抢购风暴【转载】

    转自: 干货分享:MySQL之化险为夷的[钻石]抢购风暴 - Vanos_韩尛哲 - 博客园http://www.cnblogs.com/Vanos-lcp/p/5642097.html 抢购钻石不稀 ...

  9. 老李分享:导出xml报告到手机

    老李分享:导出xml报告到手机   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...

随机推荐

  1. Cocos Creator 资源加载流程剖析【五】——从编辑器到运行时

    我们在编辑器中看到的资源,在构建之后会进行一些转化,本章将揭开Creator对资源进行的处理. 资源处理的整体规则 首先我们将Creator的开发和运行划分为以下几个场景: 编辑器 当我们将资源放到编 ...

  2. Android进程管理机制研究

    一.Linux中的进程管理在Linux中,进程是指处理器上执行的一个实例,可使用任意资源以便完成它的任务,具体的进程管理,是通过“进程描述符”来完成的,对应Linux内核中的task_struct数据 ...

  3. [springMvc]常见配置

    [springMvc]常见配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...

  4. leaflet-webpack 入门开发系列四图层控件样式优化篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  5. iOS多线程知识梳理

    iOS多线程知识梳理 线程进程基础概念 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 线程 1个进程要想执行任务,必须得有线程(每1个 ...

  6. 分析Android APK- smali 语言简介

    2.1 smali 语言简介 1.smali apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件. smali语言是Davlik的寄存器语言,语法上和汇 ...

  7. Maven详解(非原创)

    文章大纲 一.maven功能介绍二.maven整合javaweb案例三.私服应用(了解)四.总结五.相关资料下载六.参考文章 一.maven功能介绍 1. maven基本介绍   Maven的Apac ...

  8. SQL Server优化技巧——如何避免查询条件OR引起的性能问题

    之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起全表扫描或索引扫描的各种案例,以及如何优化查询条件中含有OR的SQL语句的 ...

  9. EasyExcel示例(阿里巴巴)基于Maven

    首先感谢阿里巴巴提供了easyexcel工具类,github地址:https://github.com/alibaba/easyexcel 注意!!这里只是一个简单的示例,VC大法即可使用,对于复杂的 ...

  10. javascript随机数发现的一个parseInt函数的问题

    前几天想伪造一些数据,用到了随机数,没有自己写,便在网上找了一下,找到了这篇文章:https://www.cnblogs.com/starof/p/4988516.html .之后测试了一下,发现了一 ...