我想从我的asp.net mvc应用程序打印收据。目前我认为我最好的选择是创建PDF文件,这些文件在打印时更容易处理,因为边距/页眉/页脚/等等。
我不想让他们配置他们的浏览器只是为了打印我的收据,其中一些不是那么聪明。
还有其他选择吗?
从asp.net mvc应用程序生成PDF的最佳(免费)库/ api是什么
答案 0 :(得分:9)
使用Report.NET代码在MVC操作中返回他们的hello world示例:
public void MyPDFAction()
{
Root.Reports.Report report = new Root.Reports.Report(new PdfFormatter());
FontDef fd = new FontDef(report, "Helvetica");
FontProp fp = new FontPropMM(fd, 25);
Page page = new Page(report);
page.AddCB_MM(80, new RepString(fp, "Hello World!"));
RT.ViewPDF(report, "HelloWorld.pdf");
}
操作的返回类型为void,因为Report.NET代码直接更新响应,默认情况下会为void操作返回该响应。这将直接从浏览器打开一个pdf查看器。
要将响应作为页面而不是下载返回,请使用
替换RT.ViewPDF行RT.ResponsePDF(report, System.Web.HttpContext.Current.Response);
但是,此方法被标记为已弃用,而有利于处理System.Web.UI.Page的方法。不幸的是,我不知道如何在MVC应用程序的上下文中处理Page对象。
我无法让Report.NET开始下载PDF文件。
下载Report.NET here。
编辑我最近发现PDFSharp似乎比Report.NET更新。它也可以在MIT许可下使用。您可以从here下载。还有一个广泛的wiki,有很多例子。
在MVC中作为下载文件返回的基本代码:
[HttpGet]
public ActionResult MyPdfAction()
{
using (MemoryStream stream = new MemoryStream())
{
PdfDocument document = new PdfDocument();
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
XFont font = new XFont("Verdana", 20, XFontStyle.Bold);
gfx.DrawString("Hello, World!", font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Center);
document.Save(stream, false);
return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf");
}
}
另一个编辑如果您对使用表生成大部分基于文本的文档感兴趣,那么值得查看MigraDoc,因为它在PDFSharp原语之上提供了一个有用的抽象层。 MigraDoc包含在PDFSharp下载中。您需要将PDFSharp,PDFSharp.Charting,MigraDoc.DocumentObjectModel和MigraDoc.Rendering项目添加到您的项目中,以使其全部正常工作。
生成PDF以供下载的代码:
[HttpGet]
public ActionResult MyPdfAction()
{
using (MemoryStream stream = new MemoryStream())
{
Document document = CreateDocument();
document.UseCmykColor = true;
const bool unicode = false;
const PdfFontEmbedding embedding = PdfFontEmbedding.Always;
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(unicode, embedding);
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save(stream, false);
return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf");
}
}
/// <summary>
/// Creates an absolutely minimalistic document.
/// </summary>
static Document CreateDocument()
{
Document document = new Document();
Section section = document.AddSection();
Paragraph paragraph = section.AddParagraph();
paragraph.Format.Font.Color = Color.FromCmyk(100, 30, 20, 50);
paragraph.AddFormattedText("Hello, World!", TextFormat.Bold);
return document;
}
摘要在研究了C#MVC的大量PDF解决方案之后,我正在使用PDFSharp / MigraDoc。我已经打折iTextSharp并基于它进行项目,因为如果你在商业上使用它会产生昂贵的许可成本(在我的情况下为2500欧元)。 Report.NET是在考虑ASP.NET经典的情况下开发的,自2006年以来一直没有收到更新。
答案 1 :(得分:7)
我使用Report.net以及iTextSharp以PDF格式创建条形码标签取得了很大成功。特别是对于iTextSharp,API看起来很简单,并且在我们的ASP.NET MVC应用程序中运行良好。没有很多关于iTextSharp的文档,所以你必须查找iText的java文档(它是它的端口)。
奖金:他们都是自由的!
答案 2 :(得分:2)
如果您使用的是MVC 4,请查看:http://www.nyveldt.com/blog/post/Introducing-RazorPDF
答案 3 :(得分:0)
如果您希望生成可以打印的PDF,我会使用iTextSharp,但就其他选项而言,为什么不使用css来设置页面的打印机友好选项呢?
答案 4 :(得分:0)
public ActionResult Index()
{
DiplomaModel objdb = new DiplomaModel();
return View(from Diploma in objdb.DiplomaList.Take(10)
select Diploma);
}
[HttpPost]
[ValidateInput(false)]
public FileResult Export(string GridHtml)
{
using (MemoryStream stream = new MemoryStream())
{
StringReader sr = new StringReader(GridHtml);
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
pdfDoc.Open();
XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
pdfDoc.Close();
return File(stream.ToArray(), "application/pdf", "Grid.pdf");
}
}
@查看部分
@model AUC.CommonUtility.DiplomaModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>PDF Generate</title>
<style type="text/css">
body {
font-family: Arial;
font-size: 9pt;
}
</style>
</head>
<body>
<h4>Student</h4>
<hr />
<div id="Grid">
<table cellpadding="5" cellspacing="0" style="border: 1px solid #ccc;font-size: 9pt;">
<tr>
<th style="background-color: #B8DBFD;border: 1px solid #ccc">Student Name</th>
<th style="background-color: #B8DBFD;border: 1px solid #ccc">Father Name</th>
</tr>
@foreach (var item in Model.DiplomaList)
{
<tr>
<td style="width:120px;border: 1px solid #ccc">@item.DiplomaStudentName</td>
<td style="width:120px;border: 1px solid #ccc">@item.DSFatherName</td>
</tr>
}
</table>
</div>
<br />
<br />
@using (Html.BeginForm("Export", "ExportPDF", FormMethod.Post))
{
<input type="hidden" name="GridHtml" />
<input type="submit" id="btnSubmit" value="Export" />
}
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
$("#btnSubmit").click(function () {
$("input[name='GridHtml']").val($("#Grid").html());
});
});
</script>
</body>
</html>