环境
- .Net Framework 4.5.1
- iTextSharp 5.5.13
- itextsharp.xmlworker 5.5.13
- Aspose.Cells 19.3.0
- Aspose.Words 19.3.0
- O2S.Components.PDFRender4NET 4.5.1.2
代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.UI.WebControls.WebParts;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using O2S.Components.PDFRender4NET;
using Font = iTextSharp.text.Font;
using TextDocument = iTextSharp.text.Document;
using TextParagraph = iTextSharp.text.Paragraph;
using Aspose.Words;
using AsposeDocument = Aspose.Words.Document;
using Aspose.Cells;
using Aspose.Pdf.Generator;
using PageSize = iTextSharp.text.PageSize;
namespace PdfDemo.Class
{
public class PdfConvert
{
public enum Definition
{
One = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10
}
/// <summary>
/// 创建第一个PDF文档
/// </summary>
public static void GenerateFirstPdf()
{
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "first.pdf");
TextDocument document = new TextDocument();
PdfWriter writer = PdfWriter.GetInstance(document,new FileStream(filePath,FileMode.Create));
document.Open();
document.Add(new TextParagraph("Hello Word!"));
document.Close();
}
/// <summary>
/// html转换为pdf
/// </summary>
/// <param name="pHtml"></param>
/// <returns></returns>
public static byte[] HtmlToPdfFile(string pHtml)
{
using (MemoryStream stream = new MemoryStream())
{
StringReader sr = new StringReader(pHtml);
TextDocument pdfDoc = new TextDocument(PageSize.A4,10f,10f,10f,10f);
PdfWriter writer = PdfWriter.GetInstance(pdfDoc,stream);
pdfDoc.Open();
XMLWorkerHelper.GetInstance().ParseXHtml(writer,pdfDoc,sr);
pdfDoc.Close();
return stream.ToArray();
}
}
/// <summary>
/// HTML转成PDF
/// </summary>
/// <param name="pHtml"></param>
/// <returns></returns>
public static byte[] HtmlToPdfBytes(string pHtml)
{
if (string.IsNullOrEmpty(pHtml))
{
return null;
}
var outputStream = new MemoryStream(); //要把PDF写入的流
var data = Encoding.UTF8.GetBytes(pHtml); //把要转换的字符串转成bytes
var msInput = new MemoryStream(data);
var pdfDoc = new TextDocument(); //使用A4大小构建要写的PDF文件,默认也是A4
var writer = PdfWriter.GetInstance(pdfDoc, outputStream);
//为PDF文件添加页脚
PageEventHelper pageEventHelper = new PageEventHelper();
writer.PageEvent = pageEventHelper;
var pdfDest = new PdfDestination(PdfDestination.XYZ, 0, pdfDoc.PageSize.Height, 1f);
//开启Document文件
pdfDoc.Open();
//使用XMLWorkerHelper把HTML内容parse到PDF文档里
//XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, msInput, null, Encoding.UTF8);
XMLWorkerHelper.GetInstance()
.ParseXHtml(writer, pdfDoc, msInput, null, Encoding.UTF8, new UnicodeFontFactory());
//将pdfDest的设定写入PDF文档里
var action = PdfAction.GotoLocalPage(1, pdfDest, writer);
writer.SetOpenAction(action);
pdfDoc.Close();
msInput.Close();
outputStream.Close();
return outputStream.ToArray();
}
/// <summary>
/// 将PDF文档转换为图片的方法
/// </summary>
/// <param name="pdfInputPath">PDF文件路径</param>
/// <param name="imageOutputPath">图片输出路径</param>
/// <param name="imageName">生成图片的名字</param>
/// <param name="startPageNum">从PDF文档的第几页开始转换</param>
/// <param name="endPageNum">从PDF文档的第几页开始停止转换</param>
/// <param name="imageFormat">设置所需图片格式</param>
/// <param name="definition">设置图片的清晰度,数字越大越清晰</param>
public static void ConvertPDF2Image(string pdfInputPath, string imageOutputPath,
string imageName, int startPageNum, int endPageNum, ImageFormat imageFormat, Definition definition)
{
PDFFile pdfFile = PDFFile.Open(pdfInputPath);
if (!Directory.Exists(imageOutputPath))
{
Directory.CreateDirectory(imageOutputPath);
}
// validate pageNum
if (startPageNum <= 0)
{
startPageNum = 1;
}
if (endPageNum > pdfFile.PageCount || endPageNum <= 0)
{
endPageNum = pdfFile.PageCount;
}
if (startPageNum > endPageNum)
{
int tempPageNum = startPageNum;
startPageNum = endPageNum;
endPageNum = startPageNum;
}
// start to convert each page
for (int i = startPageNum; i <= endPageNum; i++)
{
Bitmap pageImage = pdfFile.GetPageImage(i - 1, 56 * (int)definition);
pageImage.Save(imageOutputPath + imageName + i.ToString() + "." + imageFormat.ToString(), imageFormat);
pageImage.Dispose();
}
pdfFile.Dispose();
}
public static string ConvertPDF2Image(string pdfInputPath, Definition definition)
{
Stream res = null;
using (var client = new HttpClient())
{
var response = client.GetAsync(pdfInputPath).Result;
if (response.IsSuccessStatusCode)
{
res = response.Content.ReadAsStreamAsync().Result;
}
}
PDFFile pdfFile = PDFFile.Open(res);
Bitmap pageImage = null;
MemoryStream ms = null;
try
{
pageImage = pdfFile.GetPageImage(0, 56 * (int)definition);
if (pageImage != null)
{
ms = new MemoryStream();
pageImage.Save(ms,ImageFormat.Png);
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PDF", "1.png");
// pageImage.Save(filePath);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int) ms.Length);
ms.Close();
// return Convert.ToBase64String(arr);
var mms = new MemoryStream(arr);
FileStream fs = new FileStream(filePath,FileMode.CreateNew);
mms.WriteTo(fs);
return null;
}
return null;
}
catch (Exception ex)
{
Console.WriteLine(ex);
return null;
}
finally
{
pageImage?.Dispose();
pdfFile.Dispose();
}
}
/// <summary>
/// 使用Aspose插件把word或者excel转成pdf
/// </summary>
/// <param name="fileStream"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public static string OfficeToPdf(Stream fileStream,string fileName)
{
var index = fileName.LastIndexOf(".", StringComparison.Ordinal);
var name = fileName.Substring(0, index + 1);
var extension = fileName.Substring(index + 1);
var pdfName = Path.Combine("PDF", name + ".pdf");
var pdfPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, pdfName);
switch (extension.ToLower())
{
case "docx":
case "wps":
var doc = new AsposeDocument(fileStream);
doc.Save(pdfPath, Aspose.Words.SaveFormat.Pdf);
break;
case "xlsx":
case "xls":
var excel = new Workbook(fileStream);
excel.Save(pdfPath,Aspose.Cells.SaveFormat.Pdf);
break;
case "pdf":
var pdf = new Aspose.Pdf.Document(fileStream);
pdf.Save(pdfPath, Aspose.Pdf.SaveFormat.Pdf);
break;
//case "pptx":
// var pptx = new Aspose.Slides.Presentation(fileStream);
// pptx.Save(pdfPath,Aspose.Slides.Export.SaveFormat.Pdf);
// break;
}
return pdfName;
}
public static void Test(string pHtml)
{
var pdf = new Aspose.Pdf.Generator.Pdf();
Aspose.Pdf.Generator.Section section = pdf.Sections.Add();
Aspose.Pdf.Generator.Text text = new Text(section, pHtml);
text.IsHtml5Supported = true;
text.IfHtmlTagSupportedOverwriteHtmlFontNames = true;
text.IfHtmlTagSupportedOverwriteHtmlFontSizes = true;
section.Paragraphs.Add(text);
pdf.HtmlInfo.BadHtmlHandlingStrategy = BadHtmlHandlingStrategy.TreatAsPlainText;
pdf.HtmlInfo.ShowUnknownHtmlTagsAsText = true;
//pdf.BindHTML(pHtml);
var name = "pdfhaha";
var pdfName = Path.Combine("PDF", name + ".pdf");
var pdfPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, pdfName);
pdf.Save(pdfPath);
}
}
/// <summary>
/// 自定义字体类
/// </summary>
public class UnicodeFontFactory : FontFactoryImp
{
private static readonly string _fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
//宋体
private static readonly string StFontPath = Path.Combine(_fontPath, "simsun.ttc,0");
public override Font GetFont(string fontName, string encoding, bool embedded, float size, int style,
BaseColor color, bool cached)
{
BaseFont baseFont = BaseFont.CreateFont(StFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
return new Font(baseFont, size, style, color);
}
}
public class PageEventHelper : PdfPageEventHelper
{
PdfContentByte cb;
PdfTemplate template;
public override void OnOpenDocument(PdfWriter writer, TextDocument document)
{
cb = writer.DirectContent;
template = cb.CreateTemplate(100, 50);
}
public override void OnStartPage(PdfWriter writer, TextDocument document)
{
base.OnStartPage(writer, document);
}
public override void OnEndPage(PdfWriter writer, TextDocument document)
{
base.OnEndPage(writer, document);
String text = "第" + writer.PageNumber.ToString() + "页";
UnicodeFontFactory info = new UnicodeFontFactory();
//float len = 10;
float len = (document.PageSize.Width - document.LeftMargin - document.RightMargin) / 2;
iTextSharp.text.Rectangle pageSize = document.PageSize;
cb.SetRGBColorFill(100, 100, 100);
string fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
string stFontPath = Path.Combine(fontPath, "simsun.ttc,0");
BaseFont baseFont = BaseFont.CreateFont(stFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
cb.BeginText();
cb.SetFontAndSize(baseFont, 10);
cb.SetTextMatrix(document.LeftMargin + len - 20, pageSize.GetBottom(document.BottomMargin));
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
}
public override void OnCloseDocument(PdfWriter writer, TextDocument document)
{
base.OnCloseDocument(writer, document);
string fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
string stFontPath = Path.Combine(fontPath, "simsun.ttc,0");
BaseFont baseFont = BaseFont.CreateFont(stFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
template.BeginText();
template.SetFontAndSize(baseFont, 10);
template.SetTextMatrix(12, 0);
template.ShowText("共" + writer.PageNumber + "页");
template.EndText();
}
}
}