在.NET中没有很好操作pdf的类库,如果你需要对pdf进行编辑,加密,模板打印等等都可以选择使用ITextSharp来实现。

第一步:可以点击这里下载,新版本的插件升级和之前对比主要做了这几项重大改变

1.初始化对汉字的支持

2.对页眉页脚的加载形式

第二步:制作pdf模板

可以下载Adobe Acrobat DC等任意一款pdf编辑工具,视图——工具——准备表单,可以在需要赋值的地方放上一个文本框,可以把名称修改为有意义的名称,后面在赋值时要用到。

第三步:建项目引入各个操作类

介于前段时间项目所需特意把ITextSharp进行了二次封装,使我们对pdf操作起来更加方便。

列一下各文件的作用:

CanvasRectangle.cs对Rectangle对象的基类支持,可以灵活定义一个Rectangle。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PDFReport
{
/// <summary>
/// 画布对象
/// </summary>
public class CanvasRectangle
{
#region CanvasRectangle属性
public float StartX { get; set; }
public float StartY { get; set; }
public float RectWidth { get; set; }
public float RectHeight { get; set; }
#endregion #region 初始化Rectangle
/// <summary>
/// 提供rectangle信息
/// </summary>
/// <param name="startX">起点X坐标</param>
/// <param name="startY">起点Y坐标</param>
/// <param name="rectWidth">指定rectangle宽</param>
/// <param name="rectHeight">指定rectangle高</param>
public CanvasRectangle(float startX, float startY, float rectWidth, float rectHeight)
{
this.StartX = startX;
this.StartY = startY;
this.RectWidth = rectWidth;
this.RectHeight = rectHeight;
} #endregion #region 获取图形缩放百分比
/// <summary>
/// 获取指定宽高压缩后的百分比
/// </summary>
/// <param name="width">目标宽</param>
/// <param name="height">目标高</param>
/// <param name="containerRect">原始对象</param>
/// <returns>目标与原始对象百分比</returns>
public static float GetPercentage(float width, float height, CanvasRectangle containerRect)
{
float percentage = ; if (height > width)
{
percentage = containerRect.RectHeight / height; if (width * percentage > containerRect.RectWidth)
{
percentage = containerRect.RectWidth / width;
}
}
else
{
percentage = containerRect.RectWidth / width; if (height * percentage > containerRect.RectHeight)
{
percentage = containerRect.RectHeight / height;
}
} return percentage;
}
#endregion } }

CanvasRectangle.cs

PdfBase.cs主要继承PdfPageEventHelper,并实现IPdfPageEvent接口的具体实现,其实也是在pdf的加载,分页等事件中可以重写一些具体操作。

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PDFReport
{
public class PdfBase : PdfPageEventHelper
{
#region 属性
private String _fontFilePathForHeaderFooter = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "SIMHEI.TTF");
/// <summary>
/// 页眉/页脚所用的字体
/// </summary>
public String FontFilePathForHeaderFooter
{
get
{
return _fontFilePathForHeaderFooter;
} set
{
_fontFilePathForHeaderFooter = value;
}
} private String _fontFilePathForBody = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "SIMSUN.TTC,1");
/// <summary>
/// 正文内容所用的字体
/// </summary>
public String FontFilePathForBody
{
get { return _fontFilePathForBody; }
set { _fontFilePathForBody = value; }
} private PdfPTable _header;
/// <summary>
/// 页眉
/// </summary>
public PdfPTable Header
{
get { return _header; }
private set { _header = value; }
} private PdfPTable _footer;
/// <summary>
/// 页脚
/// </summary>
public PdfPTable Footer
{
get { return _footer; }
private set { _footer = value; }
} private BaseFont _baseFontForHeaderFooter;
/// <summary>
/// 页眉页脚所用的字体
/// </summary>
public BaseFont BaseFontForHeaderFooter
{
get { return _baseFontForHeaderFooter; }
set { _baseFontForHeaderFooter = value; }
} private BaseFont _baseFontForBody;
/// <summary>
/// 正文所用的字体
/// </summary>
public BaseFont BaseFontForBody
{
get { return _baseFontForBody; }
set { _baseFontForBody = value; }
} private Document _document;
/// <summary>
/// PDF的Document
/// </summary>
public Document Document
{
get { return _document; }
private set { _document = value; }
} #endregion public override void OnOpenDocument(PdfWriter writer, Document document)
{
try
{
BaseFontForHeaderFooter = BaseFont.CreateFont(FontFilePathForHeaderFooter, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
BaseFontForBody = BaseFont.CreateFont(FontFilePathForBody, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
document.Add(new Phrase("\n\n"));
Document = document;
}
catch (DocumentException de)
{ }
catch (System.IO.IOException ioe)
{ }
} #region GenerateHeader
/// <summary>
/// 生成页眉
/// </summary>
/// <param name="writer"></param>
/// <returns></returns>
public virtual PdfPTable GenerateHeader(iTextSharp.text.pdf.PdfWriter writer)
{
return null;
}
#endregion #region GenerateFooter
/// <summary>
/// 生成页脚
/// </summary>
/// <param name="writer"></param>
/// <returns></returns>
public virtual PdfPTable GenerateFooter(iTextSharp.text.pdf.PdfWriter writer)
{
return null;
}
#endregion public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
{
base.OnEndPage(writer, document); //输出页眉
Header = GenerateHeader(writer);
Header.TotalWidth = document.PageSize.Width - 20f;
///调用PdfTable的WriteSelectedRows方法。该方法以第一个参数作为开始行写入。
///第二个参数-1表示没有结束行,并且包含所写的所有行。
///第三个参数和第四个参数是开始写入的坐标x和y.
Header.WriteSelectedRows(, -, , document.PageSize.Height - , writer.DirectContent); //输出页脚
Footer = GenerateFooter(writer);
Footer.TotalWidth = document.PageSize.Width - 20f;
Footer.WriteSelectedRows(, -, , document.PageSize.GetBottom(), writer.DirectContent);
}
}
}

PdfBase.cs

PdfImage.cs对图像文件的操作

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PDFReport
{
/// <summary>
/// pdf图片操作类
/// </summary>
public class PdfImage
{ #region PdfImage属性
/// <summary>
/// 图片URL地址
/// </summary>
public string ImageUrl { get; set; }
/// <summary>
/// 图片域宽
/// </summary>
public float FitWidth { get; set; }
/// <summary>
/// 图片域高
/// </summary>
public float FitHeight { get; set; }
/// <summary>
/// 绝对X坐标
/// </summary>
public float AbsoluteX { get; set; }
/// <summary>
/// 绝对Y坐标
/// </summary>
public float AbsoluteY { get; set; }
/// <summary>
/// Img内容
/// </summary>
public byte[] ImgBytes { get; set; }
/// <summary>
/// 是否缩放
/// </summary>
public bool ScaleParent { get; set; }
/// <summary>
/// 画布对象
/// </summary>
public CanvasRectangle ContainerRect { get; set; } #endregion #region PdfImage构造
/// <summary>
/// 网络图片写入
/// </summary>
/// <param name="imageUrl">图片URL地址</param>
/// <param name="fitWidth"></param>
/// <param name="fitHeight"></param>
/// <param name="absolutX"></param>
/// <param name="absoluteY"></param>
/// <param name="scaleParent"></param>
public PdfImage(string imageUrl, float fitWidth, float fitHeight, float absolutX, float absoluteY, bool scaleParent)
{
this.ImageUrl = imageUrl;
this.FitWidth = fitWidth;
this.FitHeight = fitHeight;
this.AbsoluteX = absolutX;
this.AbsoluteY = absoluteY;
this.ScaleParent = scaleParent;
} /// <summary>
/// 本地文件写入
/// </summary>
/// <param name="imageUrl">图片URL地址</param>
/// <param name="fitWidth"></param>
/// <param name="fitHeight"></param>
/// <param name="absolutX"></param>
/// <param name="absoluteY"></param>
/// <param name="scaleParent"></param>
/// <param name="imgBytes"></param>
public PdfImage(string imageUrl, float fitWidth, float fitHeight, float absolutX, float absoluteY, bool scaleParent, byte[] imgBytes)
{
this.ImageUrl = imageUrl;
this.FitWidth = fitWidth;
this.FitHeight = fitHeight;
this.AbsoluteX = absolutX;
this.AbsoluteY = absoluteY;
this.ScaleParent = scaleParent;
this.ImgBytes = imgBytes;
} #endregion #region 指定pdf模板文件添加图片
/// <summary>
/// 指定pdf模板文件添加图片
/// </summary>
/// <param name="tempFilePath"></param>
/// <param name="createdPdfPath"></param>
/// <param name="pdfImages"></param>
public void PutImages(string tempFilePath, string createdPdfPath, List<PdfImage> pdfImages)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null; try
{
pdfReader = new PdfReader(tempFilePath);
pdfStamper = new PdfStamper(pdfReader, new FileStream(createdPdfPath, FileMode.OpenOrCreate)); var pdfContentByte = pdfStamper.GetOverContent();//获取PDF指定页面内容 foreach (var pdfImage in pdfImages)
{
Uri uri = null;
Image img = null; var imageUrl = pdfImage.ImageUrl; //如果使用网络路径则先将图片转化位绝对路径
if (imageUrl.StartsWith("http"))
{
//var absolutePath = Path.Combine(System.Web.HttpContext.Current.Server.MapPath(".."), imageUrl);
var absolutePath = System.Web.HttpContext.Current.Server.MapPath("..") + imageUrl;
uri = new Uri(absolutePath);
img = Image.GetInstance(uri);
}
else
{
//如果直接使用图片文件则直接创建iTextSharp的Image对象
if (pdfImage.ImgBytes != null)
{
img = Image.GetInstance(new MemoryStream(pdfImage.ImgBytes));
}
} if (img != null)
{ if (pdfImage.ScaleParent)
{
var containerRect = pdfImage.ContainerRect; float percentage = 0.0f;
percentage =CanvasRectangle.GetPercentage(img.Width, img.Height, containerRect);
img.ScalePercent(percentage * ); pdfImage.AbsoluteX = (containerRect.RectWidth - img.Width * percentage) / + containerRect.StartX;
pdfImage.AbsoluteY = (containerRect.RectHeight - img.Height * percentage) / + containerRect.StartY;
}
else
{
img.ScaleToFit(pdfImage.FitWidth, pdfImage.FitHeight);
} img.SetAbsolutePosition(pdfImage.AbsoluteX, pdfImage.AbsoluteY);
pdfContentByte.AddImage(img);
}
} pdfStamper.FormFlattening = true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (pdfStamper != null)
{
pdfStamper.Close();
} if (pdfReader != null)
{
pdfReader.Close();
} pdfStamper = null;
pdfReader = null;
}
}
#endregion
}
}

PdfImage.cs

PdfPageMerge.cs对pdf文件及文件、各种文件格式文件内容进行合并。

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PDFReport
{
public class PdfPageMerge
{
private PdfWriter pw;
private PdfReader reader;
private Document document;
private PdfContentByte cb;
private PdfImportedPage newPage;
private FileStream fs;
/// <summary>
/// 通过输出文件来构建合并管理,合并到新增文件中,合并完成后调用FinishedMerge方法
/// </summary>
/// <param name="sOutFiles">输出文件</param>
public PdfPageMerge(string sOutFiles)
{
document = new Document(PageSize.A4);
fs=new FileStream(sOutFiles, FileMode.Create);
pw = PdfWriter.GetInstance(document, fs);
document.Open();
cb = pw.DirectContent;
}
/// <summary>
/// 通过文件流来合并文件,合并到当前的可写流中,合并完成后调用FinishedMerge方法
/// </summary>
/// <param name="sm"></param>
public PdfPageMerge(Stream sm)
{
document = new Document();
pw = PdfWriter.GetInstance(document, sm);
document.Open();
cb = pw.DirectContent;
}
/// <summary>
/// 合并文件
/// </summary>
/// <param name="sFiles">需要合并的文件路径名称</param>
/// <returns></returns>
public bool MergeFile(string sFiles)
{
reader = new PdfReader(sFiles);
{
int iPageNum = reader.NumberOfPages;
for (int j = ; j <= iPageNum; j++)
{
newPage = pw.GetImportedPage(reader, j);
//Rectangle r = reader.GetPageSize(j);
Rectangle r = reader.GetPageSizeWithRotation(j);
document.SetPageSize(r);
cb.AddTemplate(newPage, , );
document.NewPage();
} }
reader.Close();
return true;
}
/// <summary>
/// 通过字节数据合并文件
/// </summary>
/// <param name="pdfIn">PDF字节数据</param>
/// <returns></returns>
public bool MergeFile(byte[] pdfIn)
{
reader = new PdfReader(pdfIn);
{
int iPageNum = reader.NumberOfPages;
for (int j = ; j <= iPageNum; j++)
{
newPage = pw.GetImportedPage(reader, j);
Rectangle r = reader.GetPageSize(j);
document.SetPageSize(r);
document.NewPage();
cb.AddTemplate(newPage, , );
}
}
reader.Close();
return true;
}
/// <summary>
/// 通过PDF文件流合并文件
/// </summary>
/// <param name="pdfStream">PDF文件流</param>
/// <returns></returns>
public bool MergeFile(Stream pdfStream)
{
reader = new PdfReader(pdfStream);
{
int iPageNum = reader.NumberOfPages;
for (int j = ; j <= iPageNum; j++)
{
newPage = pw.GetImportedPage(reader, j);
Rectangle r = reader.GetPageSize(j);
document.SetPageSize(r);
document.NewPage();
cb.AddTemplate(newPage, , );
}
}
reader.Close();
return true;
}
/// <summary>
/// 通过网络地址来合并文件
/// </summary>
/// <param name="pdfUrl">需要合并的PDF的网络路径</param>
/// <returns></returns>
public bool MergeFile(Uri pdfUrl)
{
reader = new PdfReader(pdfUrl);
{
int iPageNum = reader.NumberOfPages;
for (int j = ; j <= iPageNum; j++)
{
newPage = pw.GetImportedPage(reader, j);
Rectangle r = reader.GetPageSize(j);
document.SetPageSize(r);
document.NewPage();
cb.AddTemplate(newPage, , );
}
}
reader.Close();
return true;
}
/// <summary>
/// 完成合并
/// </summary>
public void FinishedMerge()
{
try
{
if (reader != null)
{
reader.Close();
}
if (pw != null)
{
pw.Flush();
pw.Close();
}
if (fs != null)
{
fs.Flush();
fs.Close();
}
if (document.IsOpen())
{
document.Close();
}
}
catch
{
}
} public static string AddCommentsToFile(string fileName,string outfilepath, string userComments, PdfPTable newTable)
{
string outputFileName = outfilepath;
//Step 1: Create a Docuement-Object
Document document = new Document();
try
{
//Step 2: we create a writer that listens to the document
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFileName, FileMode.Create)); //Step 3: Open the document
document.Open(); PdfContentByte cb = writer.DirectContent; //The current file path
string filename = fileName; // we create a reader for the document
PdfReader reader = new PdfReader(filename); for (int pageNumber = ; pageNumber < reader.NumberOfPages + ; pageNumber++)
{
document.SetPageSize(reader.GetPageSizeWithRotation());
document.NewPage(); //Insert to Destination on the first page
if (pageNumber == )
{
Chunk fileRef = new Chunk(" ");
fileRef.SetLocalDestination(filename);
document.Add(fileRef);
} PdfImportedPage page = writer.GetImportedPage(reader, pageNumber);
int rotation = reader.GetPageRotation(pageNumber);
if (rotation == || rotation == )
{
cb.AddTemplate(page, , -1f, 1f, , , reader.GetPageSizeWithRotation(pageNumber).Height);
}
else
{
cb.AddTemplate(page, 1f, , , 1f, , );
}
} // Add a new page to the pdf file
document.NewPage(); Paragraph paragraph = new Paragraph();
Font titleFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA
,
, iTextSharp.text.Font.BOLD
, BaseColor.BLACK
);
Chunk titleChunk = new Chunk("Comments", titleFont);
paragraph.Add(titleChunk);
document.Add(paragraph); paragraph = new Paragraph();
Font textFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA
,
, iTextSharp.text.Font.NORMAL
, BaseColor.BLACK
);
Chunk textChunk = new Chunk(userComments, textFont);
paragraph.Add(textChunk); document.Add(paragraph);
document.Add(newTable);
}
catch (Exception e)
{
throw e;
}
finally
{
document.Close();
}
return outputFileName;
} }
}

PdfPageMerge.cs

PdfTable.cs对表格插入做支持,可以在表格插入时动态生成新页并可以为每页插入页眉页脚

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml; namespace PDFReport
{
/// <summary>
/// Pdf表格操作类
/// </summary>
public class PdfTable:PdfBase
{
/// <summary>
/// 向PDF中动态插入表格,表格内容按照htmltable标记格式插入
/// </summary>
/// <param name="pdfTemplate">pdf模板路径</param>
/// <param name="tempFilePath">pdf导出路径</param>
/// <param name="parameters">table标签</param>
public void PutTable(string pdfTemplate, string tempFilePath, string parameter)
{
Document doc = new Document();
try
{
if (File.Exists(tempFilePath))
{
File.Delete(tempFilePath);
} doc = new Document(PageSize.LETTER); FileStream temFs = new FileStream(tempFilePath, FileMode.OpenOrCreate);
PdfWriter PWriter = PdfWriter.GetInstance(doc,temFs);
PdfTable pagebase = new PdfTable();
PWriter.PageEvent = pagebase;//添加页眉页脚 BaseFont bf1 = BaseFont.CreateFont("C:\\Windows\\Fonts\\SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font CellFont = new iTextSharp.text.Font(bf1, );
doc.Open(); PdfContentByte cb = PWriter.DirectContent;
PdfReader reader = new PdfReader(pdfTemplate);
for (int pageNumber = ; pageNumber < reader.NumberOfPages+ ; pageNumber++)
{
doc.SetPageSize(reader.GetPageSizeWithRotation()); PdfImportedPage page = PWriter.GetImportedPage(reader, pageNumber);
int rotation = reader.GetPageRotation(pageNumber);
cb.AddTemplate(page, 1f, , , 1f, , );
doc.NewPage();
} XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(parameter);
XmlNodeList xnlTable = xmldoc.SelectNodes("table");
if (xnlTable.Count > )
{
foreach (XmlNode xn in xnlTable)
{
//添加表格与正文之间间距
doc.Add(new Phrase("\n\n")); // 由html标记和属性解析表格样式
var xmltr = xn.SelectNodes("tr");
foreach (XmlNode xntr in xmltr)
{
var xmltd = xntr.SelectNodes("td");
PdfPTable newTable = new PdfPTable(xmltd.Count);
foreach (XmlNode xntd in xmltd)
{
PdfPCell newCell = new PdfPCell(new Paragraph(, xntd.InnerText, CellFont));
newTable.AddCell(newCell);//表格添加内容
var tdStyle = xntd.Attributes["style"];//获取单元格样式
if (tdStyle != null)
{
string[] styles = tdStyle.Value.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, string> dicStyle = new Dictionary<string, string>();
foreach (string strpar in styles)
{
string[] keyvalue=strpar.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
dicStyle.Add(keyvalue[], keyvalue[]);
} //设置单元格宽度
if (dicStyle.Select(sty => sty.Key.ToLower().Equals("width")).Count() > )
{
newCell.Width =float.Parse(dicStyle["width"]);
}
//设置单元格高度
if (dicStyle.Select(sty => sty.Key.ToLower().Equals("height")).Count() > )
{
//newCell.Height = float.Parse(dicStyle["height"]);
} }
}
doc.Add(newTable);
}
} } doc.Close();
temFs.Close();
PWriter.Close();
}
catch (Exception ex)
{
throw ex;
}
finally
{
doc.Close();
} } #region GenerateHeader
/// <summary>
/// 生成页眉
/// </summary>
/// <param name="writer"></param>
/// <returns></returns>
public override PdfPTable GenerateHeader(iTextSharp.text.pdf.PdfWriter writer)
{
BaseFont baseFont = BaseFontForHeaderFooter;
iTextSharp.text.Font font_logo = new iTextSharp.text.Font(baseFont, , iTextSharp.text.Font.BOLD);
iTextSharp.text.Font font_header1 = new iTextSharp.text.Font(baseFont, , iTextSharp.text.Font.BOLD);
iTextSharp.text.Font font_header2 = new iTextSharp.text.Font(baseFont, , iTextSharp.text.Font.BOLD);
iTextSharp.text.Font font_headerContent = new iTextSharp.text.Font(baseFont, , iTextSharp.text.Font.NORMAL); float[] widths = new float[] { , , , , , }; PdfPTable header = new PdfPTable(widths);
PdfPCell cell = new PdfPCell();
cell.BorderWidthBottom = ;
cell.BorderWidthLeft = ;
cell.BorderWidthTop = ;
cell.BorderWidthRight = ;
cell.FixedHeight = ; cell = GenerateOnlyBottomBorderCell(, iTextSharp.text.Element.ALIGN_LEFT); //Image img = Image.GetInstance("http://simg.instrument.com.cn/home/20141224/images/200_50logo.gif");
//img.ScaleToFit(100f, 20f);
//cell.Image = img;
cell.Phrase = new Phrase("LOGO", font_logo);
cell.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
cell.VerticalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
cell.PaddingTop = -;
header.AddCell(cell); //cell = GenerateOnlyBottomBorderCell(2, iTextSharp.text.Element.ALIGN_LEFT);
//cell.Phrase = new Paragraph("PDF报表", font_header1);
//header.AddCell(cell); cell = GenerateOnlyBottomBorderCell(, iTextSharp.text.Element.ALIGN_RIGHT);
cell.Phrase = new Paragraph("日期:", font_header2);
header.AddCell(cell); cell = GenerateOnlyBottomBorderCell(, iTextSharp.text.Element.ALIGN_LEFT);
cell.Phrase = new Paragraph(DateTime.Now.ToString("yyyy-MM-dd"), font_headerContent);
header.AddCell(cell); cell = GenerateOnlyBottomBorderCell(, iTextSharp.text.Element.ALIGN_RIGHT);
cell.Phrase = new Paragraph("第", font_header2);
header.AddCell(cell); cell = GenerateOnlyBottomBorderCell(, iTextSharp.text.Element.ALIGN_CENTER);
cell.Phrase = new Paragraph(writer.PageNumber.ToString(), font_headerContent);
header.AddCell(cell); cell = GenerateOnlyBottomBorderCell(, iTextSharp.text.Element.ALIGN_RIGHT);
cell.Phrase = new Paragraph("页", font_header2);
header.AddCell(cell);
return header;
}
#region
/// <summary>
/// 生成只有底边的cell
/// </summary>
/// <param name="bottomBorder"></param>
/// <param name="horizontalAlignment">水平对齐方式<see cref="iTextSharp.text.Element"/></param>
/// <returns></returns>
private PdfPCell GenerateOnlyBottomBorderCell(int bottomBorder,int horizontalAlignment)
{
PdfPCell cell = GenerateOnlyBottomBorderCell(bottomBorder, horizontalAlignment, iTextSharp.text.Element.ALIGN_BOTTOM);
cell.PaddingBottom = ;
return cell;
} /// <summary>
/// 生成只有底边的cell
/// </summary>
/// <param name="bottomBorder"></param>
/// <param name="horizontalAlignment">水平对齐方式<see cref="iTextSharp.text.Element"/></param>
/// <param name="verticalAlignment">垂直对齐方式<see cref="iTextSharp.text.Element"/</param>
/// <returns></returns>
private PdfPCell GenerateOnlyBottomBorderCell(int bottomBorder,int horizontalAlignment,int verticalAlignment)
{
PdfPCell cell = GenerateOnlyBottomBorderCell(bottomBorder);
cell.HorizontalAlignment = horizontalAlignment;
cell.VerticalAlignment = verticalAlignment; ;
return cell;
} /// <summary>
/// 生成只有底边的cell
/// </summary>
/// <param name="bottomBorder"></param>
/// <returns></returns>
private PdfPCell GenerateOnlyBottomBorderCell(int bottomBorder)
{
PdfPCell cell = new PdfPCell();
cell.BorderWidthBottom = ;
cell.BorderWidthLeft = ;
cell.BorderWidthTop = ;
cell.BorderWidthRight = ;
return cell;
}
#endregion #endregion #region GenerateFooter
public override PdfPTable GenerateFooter(iTextSharp.text.pdf.PdfWriter writer)
{
BaseFont baseFont = BaseFontForHeaderFooter;
iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, , iTextSharp.text.Font.NORMAL); PdfPTable footer = new PdfPTable(new float[]{,,,});
AddFooterCell(footer, "电话:010-51654077-8039", font);
AddFooterCell(footer, "传真:010-82051730", font);
AddFooterCell(footer, "电子邮件:yangdd@instrument.com.cn", font);
AddFooterCell(footer, "联系人:杨丹丹", font);
return footer;
} private void AddFooterCell(PdfPTable foot, String text, iTextSharp.text.Font font)
{
PdfPCell cell = new PdfPCell();
cell.BorderWidthTop = ;
cell.BorderWidthRight = ;
cell.BorderWidthBottom = ;
cell.BorderWidthLeft = ;
cell.Phrase = new Phrase(text, font);
cell.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER;
foot.AddCell(cell);
}
#endregion }
}

PdfTable.cs

PdfText.cs对pdf模板上的表单进行赋值,并生成新的pdf

using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PDFReport
{
/// <summary>
/// pdf文本域操作类
/// </summary>
public class PdfText
{
#region pdf模板文本域复制
/// <summary>
/// 指定pdf模板为其文本域赋值
/// </summary>
/// <param name="pdfTemplate">pdf模板路径</param>
/// <param name="tempFilePath">pdf导出路径</param>
/// <param name="parameters">pdf模板域键值</param>
public void PutText(string pdfTemplate, string tempFilePath, Dictionary<string, string> parameters)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null; try
{
if (File.Exists(tempFilePath))
{
File.Delete(tempFilePath);
} pdfReader = new PdfReader(pdfTemplate);
pdfStamper = new PdfStamper(pdfReader, new FileStream(tempFilePath, FileMode.OpenOrCreate)); AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfStamper.FormFlattening = true; BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
BaseFont simheiBase = BaseFont.CreateFont(@"C:\Windows\Fonts\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); pdfFormFields.AddSubstitutionFont(simheiBase); foreach (KeyValuePair<string, string> parameter in parameters)
{
if (pdfFormFields.Fields[parameter.Key] != null)
{
pdfFormFields.SetField(parameter.Key, parameter.Value);
}
} }
catch (Exception ex)
{
throw ex;
}
finally
{
pdfStamper.Close();
pdfReader.Close(); pdfStamper = null;
pdfReader = null;
}
}
#endregion
}
}

PdfText.cs

PdfWatermark.cs可以为pdf文档添加文字和图片水印

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PDFReport
{
/// <summary>
/// pdf水银操作
/// </summary>
public class PdfWatermark
{
#region 添加普通偏转角度文字水印
/// <summary>
/// 添加普通偏转角度文字水印
/// </summary>
/// <param name="inputfilepath">需要添加水印的pdf文件</param>
/// <param name="outputfilepath">添加水印后输出的pdf文件</param>
/// <param name="waterMarkName">水印内容</param>
public void setWatermark(string inputfilepath, string outputfilepath, string waterMarkName)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try
{
if (File.Exists(outputfilepath))
{
File.Delete(outputfilepath);
} pdfReader = new PdfReader(inputfilepath);
pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.OpenOrCreate)); int total = pdfReader.NumberOfPages + ;
iTextSharp.text.Rectangle psize = pdfReader.GetPageSize();
float width = psize.Width;
float height = psize.Height;
PdfContentByte content;
BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
PdfGState gs = new PdfGState();
for (int i = ; i < total; i++)
{
content = pdfStamper.GetOverContent(i);//在内容上方加水印
//content = pdfStamper.GetUnderContent(i);//在内容下方加水印
//透明度
gs.FillOpacity = 0.3f;
content.SetGState(gs);
//content.SetGrayFill(0.3f);
//开始写入文本
content.BeginText();
content.SetColorFill(BaseColor.LIGHT_GRAY);
content.SetFontAndSize(font, );
content.SetTextMatrix(, );
content.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, width / - , height / - , );
//content.SetColorFill(BaseColor.BLACK);
//content.SetFontAndSize(font, 8);
//content.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, 0, 0, 0);
content.EndText();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{ if (pdfStamper != null)
pdfStamper.Close(); if (pdfReader != null)
pdfReader.Close();
}
}
#endregion #region 添加倾斜水印,并加密文档
/// <summary>
/// 添加倾斜水印,并加密文档
/// </summary>
/// <param name="inputfilepath">需要添加水印的pdf文件</param>
/// <param name="outputfilepath">添加水印后输出的pdf文件</param>
/// <param name="waterMarkName">水印内容</param>
/// <param name="userPassWord">用户密码</param>
/// <param name="ownerPassWord">作者密码</param>
/// <param name="permission">许可等级</param>
public void setWatermark(string inputfilepath, string outputfilepath, string waterMarkName, string userPassWord, string ownerPassWord, int permission)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try
{
pdfReader = new PdfReader(inputfilepath);
pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.OpenOrCreate));
// 设置密码
//pdfStamper.SetEncryption(false,userPassWord, ownerPassWord, permission); int total = pdfReader.NumberOfPages + ;
PdfContentByte content;
BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
PdfGState gs = new PdfGState();
gs.FillOpacity = 0.2f;//透明度 int j = waterMarkName.Length;
char c;
int rise = ;
for (int i = ; i < total; i++)
{
rise = ;
content = pdfStamper.GetOverContent(i);//在内容上方加水印
//content = pdfStamper.GetUnderContent(i);//在内容下方加水印 content.BeginText();
content.SetColorFill(BaseColor.DARK_GRAY);
content.SetFontAndSize(font, );
// 设置水印文字字体倾斜 开始
if (j >= )
{
content.SetTextMatrix(, );
for (int k = ; k < j; k++)
{
content.SetTextRise(rise);
c = waterMarkName[k];
content.ShowText(c + "");
rise -= ;
}
}
else
{
content.SetTextMatrix(, );
for (int k = ; k < j; k++)
{
content.SetTextRise(rise);
c = waterMarkName[k];
content.ShowText(c + "");
rise -= ;
}
}
// 字体设置结束
content.EndText();
// 画一个圆
//content.Ellipse(250, 450, 350, 550);
//content.SetLineWidth(1f);
//content.Stroke();
} }
catch (Exception ex)
{
throw ex;
}
finally
{ if (pdfStamper != null)
pdfStamper.Close(); if (pdfReader != null)
pdfReader.Close();
}
}
#endregion #region 加图片水印
/// <summary>
/// 加图片水印
/// </summary>
/// <param name="inputfilepath"></param>
/// <param name="outputfilepath"></param>
/// <param name="ModelPicName"></param>
/// <param name="top"></param>
/// <param name="left"></param>
/// <returns></returns>
public bool PDFWatermark(string inputfilepath, string outputfilepath, string ModelPicName, float top, float left)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try
{
pdfReader = new PdfReader(inputfilepath); int numberOfPages = pdfReader.NumberOfPages; iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(); float width = psize.Width; float height = psize.Height; pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.OpenOrCreate)); PdfContentByte waterMarkContent; iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(ModelPicName); image.GrayFill = ;//透明度,灰色填充
//image.Rotation = 40;//旋转
image.RotationDegrees = ;//旋转角度
//水印的位置
if (left < )
{
left = width / - image.Width + left;
} //image.SetAbsolutePosition(left, (height - image.Height) - top);
image.SetAbsolutePosition(left, (height / - image.Height) - top); //每一页加水印,也可以设置某一页加水印
for (int i = ; i <= numberOfPages; i++)
{
waterMarkContent = pdfStamper.GetUnderContent(i);//内容下层加水印
//waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印 waterMarkContent.AddImage(image);
}
//strMsg = "success";
return true;
}
catch (Exception ex)
{
throw ex; }
finally
{ if (pdfStamper != null)
pdfStamper.Close(); if (pdfReader != null)
pdfReader.Close();
}
}
#endregion }
}

PdfWatermark.cs

PdfPage.aspx.cs页面调用

using PDFReport;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace CreatePDF
{
public partial class PdfPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } #region 默认文档
protected void defaultpdf_Click(object sender, EventArgs e)
{
iframepdf.Attributes["src"] = "../PDFTemplate/pdfTemplate.pdf";
}
#endregion #region 文字域
protected void CreatePdf_Click(object sender, EventArgs e)
{
string pdfTemplate = Server.MapPath("~/PDFTemplate/pdfTemplate.pdf");
string newpdf = Server.MapPath("~/PDFTemplate/newpdf.pdf");
//追加文本##########
Dictionary<string, string> dicPra = new Dictionary<string, string>();
dicPra.Add("HTjiafang", "北京美嘉生物科技有限公司111111");
dicPra.Add("Total", "");
dicPra.Add("TotalDaXie", "壹万叁仟柒佰元整");
dicPra.Add("Date", "2017年12月12日前付款3000元,2018年1月10日前付余款10700元");
new PdfText().PutText(pdfTemplate, newpdf, dicPra);
iframepdf.Attributes["src"]="../PDFTemplate/newpdf.pdf";
//Response.Write("<script> alert('已生成pdf');</script>");
}
#endregion #region 普通水印
protected void WaterMark_Click(object sender, EventArgs e)
{
string pdfTemplate = Server.MapPath("~/PDFTemplate/pdfTemplate.pdf");
string newpdf = Server.MapPath("~/PDFTemplate/newpdf1.pdf");
//添加水印############
new PdfWatermark().setWatermark(pdfTemplate, newpdf, "仪器信息网");
iframepdf.Attributes["src"] = "../PDFTemplate/newpdf1.pdf";
//Response.Write("<script> alert('已生成pdf');</script>");
}
#endregion #region 图片水印
protected void WaterMarkPic_Click(object sender, EventArgs e)
{
string pdfTemplate = Server.MapPath("~/PDFTemplate/pdfTemplate.pdf");
string newpdf = Server.MapPath("~/PDFTemplate/newpdf2.pdf");
//添加图片水印############
new PdfWatermark().PDFWatermark(pdfTemplate, newpdf, Server.MapPath("~/Images/200_50logo.gif"), , );
iframepdf.Attributes["src"] = "../PDFTemplate/newpdf2.pdf";
//Response.Write("<script> alert('已生成pdf');</script>");
}
#endregion #region 添加印章
protected void PdfImg_Click(object sender, EventArgs e)
{
string pdfTemplate = Server.MapPath("~/PDFTemplate/pdfTemplate.pdf");
string newpdf = Server.MapPath("~/PDFTemplate/newpdf3.pdf");
//追加图片#############
FileStream fs = new FileStream(Server.MapPath("~/Images/yinzhang.png"), FileMode.Open);
byte[] byData = new byte[fs.Length];
fs.Read(byData, , byData.Length);
fs.Close();
PdfImage pdfimg = new PdfImage("", 100f, 100f, 400f, 470f, false, byData);
List<PdfImage> listimg = new List<PdfImage>();
listimg.Add(pdfimg);
pdfimg.PutImages(pdfTemplate, newpdf, listimg);
iframepdf.Attributes["src"] = "../PDFTemplate/newpdf3.pdf";
//Response.Write("<script> alert('已生成pdf');</script>");
}
#endregion #region 添加表格
protected void PdfTable_Click(object sender, EventArgs e)
{
string pdfTemplate = Server.MapPath("~/PDFTemplate/pdfTemplate.pdf");
string newpdf = Server.MapPath("~/PDFTemplate/newpdf4.pdf");
//追加表格############
StringBuilder tableHtml = new StringBuilder();
tableHtml.Append(@"<table>
<tr><td>项目</td><td>细类</td><td>价格</td><td>数量</td><td>投放时间</td><td>金额</td></tr>
<tr><td>钻石会员</td><td>基础服务</td><td>69800元/月</td><td>1年</td><td>2016.01.03-2017.01.02</td><td>69800</td></tr>
<tr><td>核酸纯化系统专场</td><td>金榜题名</td><td>70000元/月</td><td>1年</td><td>2016.01.03-2017.01.02</td><td>7000</td></tr>
</table>");
new PdfTable().PutTable(pdfTemplate, newpdf, tableHtml.ToString());
iframepdf.Attributes["src"] = "../PDFTemplate/newpdf4.pdf";
//Response.Write("<script> alert('已生成pdf');</script>");
}
#endregion
}
}

PdfPage.aspx.cs

C#使用ITextSharp操作pdf的更多相关文章

  1. 【转载】 C#工具类:使用iTextSharp操作PDF文档

    iTextSharp是一个用于操作PDF文件的组件DLL程序,在C#程序中可以引用iTextSharp组件,用于开发与PDF文件相关的报表等功能,利用iTextSharp组件提供出来的方法接口,我们可 ...

  2. iTextSharp操作pdf之pdfCreater

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. itextsharp操作pdf——插入图片、二维码等

    简单介绍 业务需求,需要往pdf图纸上添加二维码功能,将实现过程记录下来 下载类库 直接下载 添加引用 添加命名空间 using System.IO; using iTextSharp.text.pd ...

  4. asp.net for itextsharp 操作pdf

    今天分享下昨天做的一个东西 asp.net 的文件 zip 批量下载,首先你需要去 到http://dotnetzip.codeplex.com这个站点下载zip 的包,在里面找到 Ionic.Zip ...

  5. 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵 ...

  6. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...

  7. 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...

  8. 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...

  9. 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...

随机推荐

  1. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...

  2. .net core 使用 ef core

    第一步: 创建一个.net core console app. 第二步:安装EFCore package 和  design(以前vs是有EF项目模板的,core版本现在没有,所有安装这个工具来创建M ...

  3. mySQL explain解释

    1).id列 数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A:simpl ...

  4. 演示stop暴力停止线程导致数据不一致的问题,但是有些有趣的发现 (2017-07-03 21:25)

    如注释所言 /** * Created by weiwei22 on 17/7/3. * * 这里主要是为了演示stop导致的数据不一致的问题.stop会暴力的结束线程并释放锁,所以有可能在恰好写了一 ...

  5. ef core code frist

    https://docs.microsoft.com/zh-cn/ef/core/get-started/aspnetcore/new-db?view=aspnetcore-2.1 1.先创建对应的实 ...

  6. SharePoint REST API - 同步SharePoint列表项

    博客地址:http://blog.csdn.net/FoxDave 本篇只讲REST服务中的GetListItemChangesSinceToken这个东西.何谓同步呢,你也可以理解为增量变化,即 ...

  7. 高级数据类型---元祖[tuple]

    一.Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改,让列表不可以被修改,以保护数据安全 元组 表示多个元素组成的序列 元组 在 Python 开发中,有特定的应用场景 用于存储 一串 ...

  8. 博弈论:寻找先手必胜策略——Grundy值

    选修了人工智能课程,老师布置了调研任务:Grundy,开始看了一些资料并没有看懂. 后来找到了一篇文,写的很棒,里面有好多博弈相关的问题与分析,分享出来给大家: http://endless.logd ...

  9. BootstrapValidator . select 必须选择一个 .callback . select .option

    1.对于: 如果 只是引用 notEmpty , 不起作用.   因为 请选择教师  也是一个 option , 一个选项. 可以使用 callback. 'userId':{ message :'教 ...

  10. python自学第14天 类

    面向对象:世界万物,皆可分类:世界万物,皆为对象 只要是对象,就肯定属于某种品类. 只要是对象,就肯定有属性 类 对象 封装 继承 多态 一个接口,多种实现