以下为在.net mvc中,生成pdf的几种方式,资料都是在做项目时网上找的
1、使用Microsoft.Office.Interop.Word.dll将word转换为PDF
dll可以单独下载,一般在电脑中有,位置:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\vs\199bd4f2\edef3bc1\assembly\dl3\60e90863\53bea978_07e9d401\Microsoft.Office.Interop.Word.DLL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public
bool
WordToPdf(
object
sourcePath,
string
targetPath)
{
bool
result =
false
;
WdExportFormat wdExportFormatPDF = WdExportFormat.wdExportFormatPDF;
object
missing = Type.Missing;
Microsoft.Office.Interop.Word.ApplicationClass applicationClass =
null
;
Microsoft.Office.Interop.Word.Document document =
null
;
try
{
applicationClass =
new
Microsoft.Office.Interop.Word.ApplicationClass();
document = applicationClass.Documents.Open(
ref
sourcePath,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing,
ref
missing);
if
(document !=
null
)
{
document.ExportAsFixedFormat(targetPath, wdExportFormatPDF,
false
, WdExportOptimizeFor.wdExportOptimizeForPrint, WdExportRange.wdExportAllDocument, 0, 0, WdExportItem.wdExportDocumentContent,
true
,
true
, WdExportCreateBookmarks.wdExportCreateWordBookmarks,
true
,
true
,
false
,
ref
missing);
}
result =
true
;
}
catch
{
result =
false
;
}
finally
{
if
(document !=
null
)
{
document.Close(
ref
missing,
ref
missing,
ref
missing);
document =
null
;
}
if
(applicationClass !=
null
)
{
applicationClass.Quit(
ref
missing,
ref
missing,
ref
missing);
applicationClass =
null
;
}
}
return
result;
}
|
使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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,并加入项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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,并加入项目
1
2
3
4
5
6
|
public
ActionResult DemoViewAsPdf()
{
return
new
ViewAsPdf(
"DemoViewAsPdf"
);
//return new ActionAsPdf("DemoViewAsPdf")
//{ FileName = "demo.pdf" };
}
|
4、PDFSharp生成pdf
nuget中查找PDFSharp,并加入项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
/// <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,并加入项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
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");
}
|
3、wkhtmltopdf
What is it?
wkhtmltopdf
and wkhtmltoimage
are open source (LGPLv3) command line tools to render HTML into PDF and various image formats using the Qt WebKit rendering engine. These run entirely "headless" and do not require a display or display service.
There is also a C library, if you're into that kind of thing.
4、基于libcef 将html /url 保存为pdf