我有iTextSharp的演示代码
Document document = new Document();
try
{
PdfWriter.GetInstance(document, new FileStream("Chap0101.pdf", FileMode.Create));
document.Open();
document.Add(new Paragraph("Hello World"));
}
catch (DocumentException de)
{
Console.Error.WriteLine(de.Message);
}
catch (IOException ioe)
{
Console.Error.WriteLine(ioe.Message);
}
document.Close();
如何让控制器将pdf文档返回浏览器?
编辑:
运行此代码确实打开了Acrobat但我收到错误消息“文件已损坏且无法修复”
public FileStreamResult pdf()
{
MemoryStream m = new MemoryStream();
Document document = new Document();
PdfWriter.GetInstance(document, m);
document.Open();
document.Add(new Paragraph("Hello World"));
document.Add(new Paragraph(DateTime.Now.ToString()));
m.Position = 0;
return File(m, "application/pdf");
}
为什么这不起作用的任何想法?
答案 0 :(得分:120)
返回FileContentResult
。控制器操作的最后一行是:
return File("Chap0101.pdf", "application/pdf");
如果要动态生成此PDF,最好使用MemoryStream
,并在内存中创建文档而不是保存到文件。代码类似于:
Document document = new Document();
MemoryStream stream = new MemoryStream();
try
{
PdfWriter pdfWriter = PdfWriter.GetInstance(document, stream);
pdfWriter.CloseStream = false;
document.Open();
document.Add(new Paragraph("Hello World"));
}
catch (DocumentException de)
{
Console.Error.WriteLine(de.Message);
}
catch (IOException ioe)
{
Console.Error.WriteLine(ioe.Message);
}
document.Close();
stream.Flush(); //Always catches me out
stream.Position = 0; //Not sure if this is required
return File(stream, "application/pdf", "DownloadName.pdf");
答案 1 :(得分:57)
我使用了这段代码。
using iTextSharp.text;
using iTextSharp.text.pdf;
public FileStreamResult pdf()
{
MemoryStream workStream = new MemoryStream();
Document document = new Document();
PdfWriter.GetInstance(document, workStream).CloseStream = false;
document.Open();
document.Add(new Paragraph("Hello World"));
document.Add(new Paragraph(DateTime.Now.ToString()));
document.Close();
byte[] byteInfo = workStream.ToArray();
workStream.Write(byteInfo, 0, byteInfo.Length);
workStream.Position = 0;
return new FileStreamResult(workStream, "application/pdf");
}
答案 2 :(得分:19)
您必须指定:
Response.AppendHeader("content-disposition", "inline; filename=file.pdf");
return new FileStreamResult(stream, "application/pdf")
要在浏览器中直接打开文件,而不是已下载
答案 3 :(得分:16)
如果您从操作方法返回FileResult
,并在控制器上使用File()
扩展方法,那么执行您想要的操作非常简单。 File()
方法有覆盖,它将采用文件的二进制内容,文件的路径或Stream
。
public FileResult DownloadFile()
{
return File("path\\to\\pdf.pdf", "application/pdf");
}
答案 4 :(得分:11)
我遇到了类似的问题,我遇到了一个解决方案。我使用了两个帖子,一个来自stack,显示了返回下载的方法,另一个one显示了ItextSharp和MVC的工作解决方案。
public FileStreamResult About()
{
// Set up the document and the MS to write it to and create the PDF writer instance
MemoryStream ms = new MemoryStream();
Document document = new Document(PageSize.A4.Rotate());
PdfWriter writer = PdfWriter.GetInstance(document, ms);
// Open the PDF document
document.Open();
// Set up fonts used in the document
Font font_heading_1 = FontFactory.GetFont(FontFactory.TIMES_ROMAN, 19, Font.BOLD);
Font font_body = FontFactory.GetFont(FontFactory.TIMES_ROMAN, 9);
// Create the heading paragraph with the headig font
Paragraph paragraph;
paragraph = new Paragraph("Hello world!", font_heading_1);
// Add a horizontal line below the headig text and add it to the paragraph
iTextSharp.text.pdf.draw.VerticalPositionMark seperator = new iTextSharp.text.pdf.draw.LineSeparator();
seperator.Offset = -6f;
paragraph.Add(seperator);
// Add paragraph to document
document.Add(paragraph);
// Close the PDF document
document.Close();
// Hat tip to David for his code on stackoverflow for this bit
// https://stackoverflow.com/questions/779430/asp-net-mvc-how-to-get-view-to-generate-pdf
byte[] file = ms.ToArray();
MemoryStream output = new MemoryStream();
output.Write(file, 0, file.Length);
output.Position = 0;
HttpContext.Response.AddHeader("content-disposition","attachment; filename=form.pdf");
// Return the output stream
return File(output, "application/pdf"); //new FileStreamResult(output, "application/pdf");
}
答案 5 :(得分:3)
您可以创建自定义类来修改内容类型并将文件添加到响应中。
答案 6 :(得分:3)
我知道这个问题已经过时但我认为我会分享这个问题,因为我找不到类似的东西。
我想使用Razor 创建我的视图/模型,并将它们渲染为Pdfs 。
这样我就可以使用标准的html输出来控制pdf表示,而不是弄清楚如何使用iTextSharp布局文档。
此处提供了项目和源代码,其中包含nuget安装说明:
https://github.com/andyhutch77/MvcRazorToPdf
Install-Package MvcRazorToPdf
答案 7 :(得分:2)
你通常会做一个Response.Flush,然后是Response.Close,但由于某种原因,iTextSharp库似乎不喜欢这个。数据无法通过,Adobe认为PDF已损坏。省略Response.Close函数,看看你的结果是否更好:
Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=file.pdf"); // open in a new window
Response.OutputStream.Write(outStream.GetBuffer(), 0, outStream.GetBuffer().Length);
Response.Flush();
// For some reason, if we close the Response stream, the PDF doesn't make it through
//Response.Close();
答案 8 :(得分:2)
HttpContext.Response.AddHeader("content-disposition","attachment; filename=form.pdf");
如果文件名是动态生成的,那么如何在此处定义文件名,它是通过guid生成的。
答案 9 :(得分:1)
如果从DB返回var-binary数据以在弹出窗口或浏览器上显示PDF,请遵循以下代码: -
查看页面
@using (Html.BeginForm("DisplayPDF", "Scan", FormMethod.Post))
{
<a href="javascript:;" onclick="document.forms[0].submit();">View PDF</a>
}
扫描控制器:
public ActionResult DisplayPDF()
{
byte[] byteArray = GetPdfFromDB(4);
MemoryStream pdfStream = new MemoryStream();
pdfStream.Write(byteArray, 0, byteArray.Length);
pdfStream.Position = 0;
return new FileStreamResult(pdfStream, "application/pdf");
}
private byte[] GetPdfFromDB(int id)
{
#region
byte[] bytes = { };
string constr = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = "SELECT Scan_Pdf_File FROM PWF_InvoiceMain WHERE InvoiceID=@Id and Enabled = 1";
cmd.Parameters.AddWithValue("@Id", id);
cmd.Connection = con;
con.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
if (sdr.HasRows == true)
{
sdr.Read();
bytes = (byte[])sdr["Scan_Pdf_File"];
}
}
con.Close();
}
}
return bytes;
#endregion
}
答案 10 :(得分:1)
FileStreamResult
当然可以。但是,如果您查看Microsoft Docs,它是从ActionResult -> FileResult
继承的,而byte[]
具有另一个派生类FileContentResult
。它“将二进制文件的内容发送到响应”。因此,如果您已经拥有FileContentResult
,则应该只使用public ActionResult DisplayPDF()
{
byte[] byteArray = GetPdfFromWhatever();
return new FileContentResult(byteArray, "application/pdf");
}
。
from scipy.optimize import fmin
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
import math
axes = plt.gca()
axes.set_ylim([-5,0])
#bond CHARMM
def func(phi, kphi, delta):
return kphi * (1 + np.cos(2*phi - delta))
class Dihedral:
def __init__(self):
self.masses = {'H': 1, 'D': 2, 'C': 12, 'O': 16}
def Dihedral_fit (self,x,y):
self.popt, pcov = curve_fit(func, x, y, p0 =(0,2.3),method='trf')
print "Cosine fit"
print self.popt
plt.plot(xdata, ydata, 'b-', label='data')
diff=sum(abs(func(x,self.popt[0],self.popt[1])-y))/len(x)
print "AAE is"
print diff
plt.plot(xdata, func(xdata, *self.popt), 'r-',label='Cos: kphi=%5.3f, delta=%5.3f' % tuple(self.popt))
if __name__ == "__main__":
xdata = [0,15,30,45,60,75,90,105]
ydata = [-4.24,-3.82,-3.08,-2.07,-1.04,-0.30,0,-30]
x = np.array(xdata)
y = np.array(ydata)
Harm=Dihedral()
Harm.Dihedral_fit(x,y)
plt.legend()
plt.show()