博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#根据html生成PDF
阅读量:4618 次
发布时间:2019-06-09

本文共 5858 字,大约阅读时间需要 19 分钟。

使用iTextSharp 控件

iTextSharp包括几个dll。

主要iTextSharp版本包含:
——itextsharp。dll:核心库
——itextsharp.xtra。dll:额外的功能(PDF 2 !)
——itextsharp.pdfa。dll:PDF /相关的功能
这个项目是托管在http://sourceforge.net/projects/itextsharp/
你可以在这里找到的最新版本:
http://sourceforge.net/projects/itextsharp/files/itextsharp/
在某些情况下,您将需要额外的dll。
这些dll是可用的:
http://sourceforge.net/projects/itextsharp/files/extras/
对于XML和HTML功能,您需要这个dll:
——itextsharp.xmlworker.dll
这是可以在http://sourceforge.net/projects/itextsharp/files/xmlworker/
最后,我们也有一个Java工具,可以帮助您调试pdf文档:
——itext-rups-x.y.z.jar
这个项目是托管在http://sourceforge.net/projects/itextrups/

下列代码需要导入两个.dll

itextsharp.dll:核心库

itextsharp.xmlworker.dll

 

 

using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using iTextSharp.text;using iTextSharp.text.pdf;using System.IO;using iTextSharp.tool.xml;using System.Text;using System.Net;namespace PDFTools{    public partial class CreatePdf : System.Web.UI.Page    {        string INPATH = System.Web.HttpContext.Current.Server.MapPath("~/bin/temp.html");        protected void Page_Load(object sender, EventArgs e)        {            string path = System.Web.HttpContext.Current.Server.MapPath("~/UploadPdf");            if (!Directory.Exists(path))                Directory.CreateDirectory(path);            WebClient wc = new WebClient();            //从网址下载Html字串            wc.Encoding = System.Text.Encoding.UTF8;            string htmlText = getWebContent();            byte[] pdfFile = this.ConvertHtmlTextToPDF(htmlText);            string fileId = "/file_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";            System.IO.File.WriteAllBytes(path + fileId, pdfFile);        }        ///         /// 判断是否有乱码        ///         ///         /// 
public bool isMessyCode(string txt) { var bytes = Encoding.UTF8.GetBytes(txt); //239 191 189 for (var i = 0; i < bytes.Length; i++) { if (i < bytes.Length - 3) if (bytes[i] == 239 && bytes[i + 1] == 191 && bytes[i + 2] == 189) { return true; } } return false; } /// /// 获取网站内容,包含了 HTML+CSS+JS /// ///
String返回网页信息
public string getWebContent() { try { WebClient MyWebClient = new WebClient(); MyWebClient.Credentials = CredentialCache.DefaultCredentials; //获取或设置用于向Internet资源的请求进行身份验证的网络凭据 Byte[] pageData = MyWebClient.DownloadData(INPATH); //从指定网站下载数据 string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是GB2312,则使用这句 bool isBool = isMessyCode(pageHtml);//判断使用哪种编码 读取网页信息 if (!isBool) { string pageHtml1 = Encoding.UTF8.GetString(pageData); pageHtml = pageHtml1; } else { string pageHtml2 = Encoding.Default.GetString(pageData); pageHtml = pageHtml2; } return pageHtml; } catch (WebException webEx) { Console.WriteLine(webEx.Message.ToString()); return webEx.Message; } } /// /// 将Html文字 输出到PDF档里 /// /// ///
public byte[] ConvertHtmlTextToPDF(string htmlText) { if (string.IsNullOrEmpty(htmlText)) { return null; } //避免当htmlText无任何html tag标签的纯文字时,转PDF时会挂掉,所以一律加上

标签 htmlText = "

" + htmlText + "

"; MemoryStream outputStream = new MemoryStream();//要把PDF写到哪个串流 byte[] data = Encoding.UTF8.GetBytes(htmlText);//字串转成byte[] MemoryStream msInput = new MemoryStream(data); Document doc = new Document();//要写PDF的文件,建构子没填的话预设直式A4 PdfWriter writer = PdfWriter.GetInstance(doc, outputStream); //指定文件预设开档时的缩放为100% PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 0, doc.PageSize.Height, 1f); //开启Document文件 doc.Open(); //使用XMLWorkerHelper把Html parse到PDF档里 // XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msInput, null, Encoding.UTF8, new UnicodeFontFactory()); XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msInput, null, Encoding.UTF8); //将pdfDest设定的资料写到PDF档 PdfAction action = PdfAction.GotoLocalPage(1, pdfDest, writer); writer.SetOpenAction(action); doc.Close(); msInput.Close(); outputStream.Close(); //回传PDF档案 return outputStream.ToArray(); } //设置字体类 public class UnicodeFontFactory : FontFactoryImp { private static readonly string arialFontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "arialuni.ttf");//arial unicode MS是完整的unicode字型。 private static readonly string 标楷体Path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "KAIU.TTF");//标楷体 public override Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color, bool cached) { BaseFont bfChiness = BaseFont.CreateFont(@"C:\Windows\Fonts\SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //可用Arial或标楷体,自己选一个 BaseFont baseFont = BaseFont.CreateFont(标楷体Path, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); return new Font(bfChiness, size, style, color); } } }}

 

转载于:https://www.cnblogs.com/lsgsanxiao/p/4762591.html

你可能感兴趣的文章
mysql的csv数据导入与导出
查看>>
leetcode笔记:Pascal&#39;s Triangle
查看>>
ASP.NET性能优化之构建自定义文件缓存
查看>>
Shell——windows上写完放入linux的时候需要注意的问题
查看>>
65条常用的正则表达式
查看>>
Vscode断点调试PHP
查看>>
做前端要做的6大事
查看>>
LeetCode 813. Largest Sum of Averages
查看>>
vSphere、Hyper-V与XenServer 你选哪个?
查看>>
java.lang.UnsupportedClassVersionError
查看>>
实现接口必须要加注解@Override吗
查看>>
apicloud UISearchBar 使用方法
查看>>
【spring+websocket的使用】
查看>>
mongo二维数组操作
查看>>
localStorage之本地储存
查看>>
Archlinux 交换左Ctrl和Cap键
查看>>
java与数据结构(6)---java实现链栈
查看>>
#openstack故障处理汇总
查看>>
搜索旋转排序数组 II
查看>>
20、docker swarm
查看>>