1、使用Microsoft.Office.Interop.Word.dll将word转换为PDF
使用
public
FileResult Demo()
{
string
wordPath = Server.MapPath(
@"\TempFile\Word\Test.docx"
);
string
pdfPath = Server.MapPath(
@"\TempFile\PDF\Test.pdf"
);
WordToPdf(wordPath, pdfPath);
FileStream fs =
new
FileStream(pdfPath, FileMode.Open, FileAccess.Read);
byte
[] fileContents =
new
byte
[(
int
)fs.Length];
fs.Read(fileContents, 0, fileContents.Length);
fs.Close();
return
File(fileContents,
"application/pdf"
,
"test.pdf"
);
}
2、itextsharp生成PDF
nuget中查找itextsharp,并加入项目
public FileResult ItextSharpDemo()
{
string filename = Server.MapPath(@"\TempFile\PDF\ItextSharpTest.pdf");
iTextSharp.text.Rectangle pageSize = new iTextSharp.text.Rectangle(1000, 500);
iTextSharp.text.Document document = new iTextSharp.text.Document(pageSize, 10, 10, 10, 10);
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(filename, FileMode.Create));
document.Open();
//设置文档相关信息
document.AddTitle("这里是标题");
document.AddSubject("主题");
document.AddKeywords("关键字");
document.AddCreator("创建者");
document.AddAuthor("作者");
//添加内容
document.Add(new iTextSharp.text.Paragraph("Hello World! Hello People! " + "这是中文"));
//添加图片
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(Server.MapPath(@"\images\1.png"));
img.SetAbsolutePosition(100, 50);
writer.DirectContent.AddImage(img);
img = iTextSharp.text.Image.GetInstance(Server.MapPath(@"\images\2.png"));
img.SetAbsolutePosition(200, 50);
writer.DirectContent.AddImage(img);
img = iTextSharp.text.Image.GetInstance(Server.MapPath(@"\images\3.png"));
img.SetAbsolutePosition(300, 50);
writer.DirectContent.AddImage(img);
document.Close();
writer.Close();
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] fileContents = new byte[(int)fs.Length];
fs.Read(fileContents, 0, fileContents.Length);
fs.Close();
return File(fileContents, "application/pdf", "test.pdf");
}
源点为左下角,不方便计算位置
3、Rotativa将html生成pdf并下载
nuget中查找Rotativa,并加入项目
public
ActionResult DemoViewAsPdf()
{
return
new
ViewAsPdf(
"DemoViewAsPdf"
);
//return new ActionAsPdf("DemoViewAsPdf")
//{ FileName = "demo.pdf" };
}
4、PDFSharp生成pdf nuget中查找PDFSharp,并加入项目
/// <summary>
/// 1、使用windows里面的字体时,报错
/// 2、默认不支持中文
/// </summary>
public void CreatePDF()
{
// 创建新的PDF文档
PdfDocument document = new PdfDocument();
// 创建空页
PdfPage page = document.AddPage();
// 设置一个画布
XGraphics gfx = XGraphics.FromPdfPage(page);
// 设置字体 单位:px
//System.Drawing.Text.PrivateFontCollection pfcFonts = new System.Drawing.Text.PrivateFontCollection();
//string strFontPath = @"C:/Windows/Fonts/msyh.ttc";//字体设置为微软雅黑
//pfcFonts.AddFontFile(strFontPath);
//XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
//XFont font = new XFont(pfcFonts.Families[0], 15, XFontStyle.Regular, options);
System.Drawing.Text.PrivateFontCollection pfcFonts = new System.Drawing.Text.PrivateFontCollection();
string strFontPath = @"C:/Windows/Fonts/msyh.ttc";//字体设置为微软雅黑
pfcFonts.AddFontFile(strFontPath);
XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
XFont font = new XFont(pfcFonts.Families[0], 20, XFontStyle.Bold, options);
// 设置(添加)文本
gfx.DrawString("Hello, World!", font, XBrushes.Black,
new XRect(0, 0, page.Width, page.Height),
XStringFormat.TopLeft);
// 图片
string imgPath = Server.MapPath(@"\images\1.png");
XImage image = XImage.FromFile(imgPath);
//double x = (gfx.PageSize.Width - image.PixelWidth * 72 / image.HorizontalResolution) / 2;
//double y = (gfx.PageSize.Height - image.PixelHeight * 72 / image.VerticalResolution) / 2;
gfx.DrawImage(image, 10, 30);
// 设置(添加)文本
//gfx.DrawString("123124121", font, XBrushes.Black,
// new XRect(0, 0, page.Width, page.Height)
// );
gfx.DrawString("这是一行中文", font, XBrushes.Black, 0, 60 + image.PixelHeight);
// 保存文档
string filename = Server.MapPath(@"\tempfile\HelloWorld.pdf");
document.Save(filename);
}
5、Spire.Pdf
nuget中查找Spire.Pdf,并加入项目
public void CreatePDF()
{
PdfDocument document = new PdfDocument();
//用于转换各种尺寸
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
//用于设置页边距
PdfMargins margins = new PdfMargins();
//设置页边距 单位:磅/点
margins.Top = unitCvtr.ConvertUnits(20f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point);
margins.Bottom = margins.Top;
margins.Left = 0;
margins.Right = margins.Left;
//新添加一个A4大小的页面,A4大小为211mm*297mm
PdfPageBase page = document.Pages.Add(PdfPageSize.A4, margins);
//字体,字体大小,font中设置字体大小的单位为磅
PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("宋体", unitCvtr.ConvertUnits(24f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point)), true);
PdfTrueTypeFont contentFont = new PdfTrueTypeFont(new Font("宋体", unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point)), true);
//字体颜色
//PdfPen为空心字
//PdfPen pen = new PdfPen(Color.Black);
PdfBrush brush = new PdfSolidBrush(Color.Black);
//写入内容,x为距离左边的距离,单位为磅,y为距离上面的距离,单位为磅
string text = ("这里是标题");
page.Canvas.DrawString(text, titleFont, brush, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), 0);
text = ("这里是内容");
page.Canvas.DrawString(text, contentFont, brush, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), unitCvtr.ConvertUnits(30f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point));
text = ("这里是内容2");
page.Canvas.DrawString(text, contentFont, brush, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), unitCvtr.ConvertUnits(50f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point));
//按指定地址加载图片
PdfImage image = PdfImage.FromFile(Server.MapPath(@"\images\1.png"));
//按图片流加载图片
//Image img;
//PdfImage img = PdfImage.FromImage(img)
//按Stream流加载图片
//System.IO.Stream stream;
//PdfImage img = PdfImage.FromStream(stream)
float width = image.Width * 0.55f;
float height = image.Height * 0.55f;
float y = unitCvtr.ConvertUnits((20f+30f+20f), PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point);
//插入图片,x为距离左边的距离,单位磅,y为距离上面的距离,单位磅,width,height为写入PDF的图片的宽高,单位像素
page.Canvas.DrawImage(image, unitCvtr.ConvertUnits(14f, PdfGraphicsUnit.Pixel, PdfGraphicsUnit.Point), y, width, height);
//保存并打开文档
document.SaveToFile(Server.MapPath(@"\tempfile\PDF创建.pdf"));
//System.Diagnostics.Process.Start("PDF创建.pdf");
}
Spire.Pdf是我在测试时唯一没有遇到中文乱码的插件,而且源点在左上角,并提供单位转换工具类,所以个人更喜欢Spire.Pdf