一、添加OpenHtmlToPdf,iTextSharp,O2S.Components.PDFRender4NET引用
(1)OpenHtmlToPdf:是一个.NET库(开源的),用于将HTML文档呈现为PDF格式。
github地址:https://github.com/vilppu/OpenHtmlToPdf
(2)iTextSharp:是一个.NET下处理pdf文件的库,提供给pdf文件加水印的功能。
官网:https://itextpdf.com/en
(3)O2S.Components.PDFRender4NET:是一个.NET库,用于将PDF文档呈现为图片。
想要在C#中把html转成PDF,PDF转成图片,首先得要有个C#版的驱动。
通过网络下载或nuget安装,得到OpenHtmlToPdf、iTextSharp、O2S.Components.PDFRender4NET相关的dll,添加到项目中引用。
第一步:在项目中右键,选择管理NuGet程序包
第二步:搜索OpenHtmlToPdf、iTextSharp,选中安装
第三步:下载O2S.Components.PDFRender4NET.dll,在Nuget中没找到,只能自己找资源下载了
下载地址:https://download.csdn.net/download/u011301348/12442663
下载完成后添加dll引用到项目中
通过这三步,在项目中有OpenHtmlToPdf、iTextSharp、O2S.Components.PDFRender4NET的引用,表示添加成功
二、创建PDFTools工具类
///
/// PDF工具
///
public class PDFTools
{
///
/// html转pdf
///
///
/// 水印图片
///
public static string HtmlToPdf(string html, string watermarkimg)
{
var document = Pdf.From(html)
.OfSize(PaperSize.A4) //大小,这里选A4纸大小
.WithGlobalSetting("margin.top", "0.4cm"); //设置全局样式
//此属性的值在32位进程中为4,在64位进程中为8。
if (IntPtr.Size == 4)
{
document = document.WithObjectSetting("load.zoomFactor", "1.5");
}
var result = document.Content();
string filePath = "pdf/" + DateTime.Now.ToString("yyyyMMddHH") + "/";//路径
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + filePath);//保存在当前项目跟路径下
}
string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".pdf";
//通过stream把html写入到pdf文件中
FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName, FileMode.Create, FileAccess.Write);
fs.Write(result, 0, result.Length);
fs.Close();
//加水印
string filewatermarkPath = filePath + DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".pdf";
var res = PDFWatermark(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName, AppDomain.CurrentDomain.BaseDirectory + filewatermarkPath, watermarkimg);
if (res)
{
if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName))
File.Delete(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName);
return filewatermarkPath;
}
else
return filePath + fileName;
}
///
/// PDF转化为图片
///
/// 文件路径
/// 分辨率
///
public static List
{
string imgPath = "pdf/IMG/" + DateTime.Now.ToString("yyyyMMddHH") + "/";
//如果文件夹不存在,则创建
if (!Directory.Exists(imgPath))
{
Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + imgPath);
}
PDFFile file = PDFFile.Open(filePath);
int pageCount = file.PageCount;
List
for (int i = 0; i < pageCount; i++)
{
string imgName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".jpg";
Bitmap img = file.GetBWPageImage(i, resolution);
img.Save(AppDomain.CurrentDomain.BaseDirectory + imgPath + imgName, System.Drawing.Imaging.ImageFormat.Jpeg);
imgPathList.Add(imgPath + imgName);
}
return imgPathList;
}
///
/// pdf加水印
///
/// 模板路径
/// 导出水印背景后的PDF
/// 水印图片
///
public static bool PDFWatermark(string inputfilepath, string outputfilepath, string ModelPicName)
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try
{
pdfReader = new PdfReader(inputfilepath);
pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
PdfGState gs = new PdfGState();
gs.FillOpacity = 0.4f;//透明度
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(ModelPicName);
int numberOfPages = pdfReader.NumberOfPages;
//每一页加2个水印,也可以设置某一页加水印
for (int i = 1; i <= numberOfPages; i++)
{
PdfContentByte waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印
//PdfContentByte waterMarkContent = pdfStamper.GetUnderContent(i);//内容下层加水印
waterMarkContent.SetGState(gs);
image.SetAbsolutePosition(20, 100);//水印定位坐标
waterMarkContent.AddImage(image);
image.SetAbsolutePosition(20, 300);
waterMarkContent.AddImage(image);
}
//一定要2个循环才会在每一个加上水印,咱也不知道为啥,反正是试了好久试出来的
for (int i = 1; i <= numberOfPages; i++)
{
PdfContentByte waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印
//PdfContentByte waterMarkContent = pdfStamper.GetUnderContent(i);//内容下层加水印
waterMarkContent.SetGState(gs);
image.SetAbsolutePosition(20, 100);
waterMarkContent.AddImage(image);
image.SetAbsolutePosition(20, 300);
waterMarkContent.AddImage(image);
}
return true;
}
catch (Exception ex)
{
ex.Message.Trim();
return false;
}
finally
{
if (pdfStamper != null)
pdfStamper.Close();
if (pdfReader != null)
pdfReader.Close();
}
}
}
三、调用
在HomeController中添加一下方法。
1.定义组装html生成pdf文件,并给pdf加水印方法
public string CreatePdf()
{
StringBuilder detail = new StringBuilder();
detail.Append(@"
pdf商品
");序号 | ");商品名称 | ");品牌 | ");单位 | ");规格 | ");价格 | ");
{i} | ");商品{i} | ");品牌{i} | ");单位{i} | ");规格{i} | ");价格{i} | ");
2.在Index中调用。
public ActionResult Index()
{
string pdfpath = CreatePdf();//生成pdf,加水印
ViewBag.pdfpath = pdfpath;
ViewBag.imgpath = PDFTools.PDFToIMG(AppDomain.CurrentDomain.BaseDirectory + pdfpath, 200);//pdf转图片
return View();
}
3.查看结果
4.浏览器中打开pdf文件效果
5.转换成图片效果
四、代码下载地址
https://download.csdn.net/download/u011301348/12446794