#asp.net #sharepoint #pdf-generation #itextsharp
#asp.net #sharepoint #pdf-генерация #itext
Вопрос:
Я использую Sharepoint 2010 и разрабатываю веб-часть, в которой при событии нажатия кнопки необходимо сгенерировать и открыть PDF-файл напрямую. Не следует сохранять на диск. Я попробовал приведенный ниже код
protected void Button1_OnClick(object sender, EventArgs e)
{
Document myDoc = new Document(PageSize.A4.Rotate());
try
{
PdfWriter.GetInstance(myDoc, new FileStream(@"C:DirectoryTest.pdf", FileMode.Create));
myDoc.Open();
myDoc.Add(new Paragraph("Hello World"));
}
catch (DocumentException ex)
{
Console.Error.WriteLine(ex.Message);
}
myDoc.Close();
}
Я также попробовал приведенный ниже код, который также генерирует файл на сервере, который мне не нужен.
Document document = new Document(PageSize.A4);
PdfWriter.GetInstance(document, new FileStream(HttpContext.Current.Server.MapPath("~/Test.pdf"), FileMode.Create));
document.Open();
var WelcomePara = new Paragraph("Hello World");
document.Add(WelcomePara);
document.Close();
Этот создает PDF-файл на рабочем столе, мне нужно, чтобы он был открыт в формате pdf.Может кто-нибудь мне помочь, пожалуйста.
Ответ №1:
Почти каждый раз, когда что-то принимает a FileStream
, на самом деле действительно принимает универсальный System.IO.Stream
объект, который FileStream
является подклассом. Это означает, что вместо этого вы можете использовать его двоюродного System.IO.MemoryStream
брата, который вам нужен:
byte[] bytes;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) {
using (iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4.Rotate())) {
using (iTextSharp.text.pdf.PdfWriter w = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, ms)) {
doc.Open();
doc.NewPage();
doc.Add(new iTextSharp.text.Paragraph("Hello world"));
doc.Close();
bytes = ms.ToArray();
}
}
}
//Do whatever you want with the byte array here
Вам не нужно создавать массив байтов, если вы не хотите, я просто показывал, как создать PDF и предоставить вам что-то «похожее на .net» для работы.
Комментарии:
1. Спасибо за ваш ответ. Я попробовал приведенный выше код, при нажатии кнопки он по-прежнему не открывает PDF-файл «Hello World». Нужно ли что-то еще сделать? Пожалуйста, помогите мне…
Ответ №2:
Наконец-то я смог заставить его работать.
using (var ms = new MemoryStream())
{
using (var document = new Document(PageSize.A4,50,50,15,15))
{
PdfWriter.GetInstance(document, ms);
document.Open();
document.Add(new Paragraph("HelloWorld"));
document.Close();
}
Response.Clear();
//Response.ContentType = "application/pdf";
Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "attachment;filename= Test.pdf");
Response.Buffer = true;
Response.Clear();
var bytes = ms.ToArray();
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.OutputStream.Flush();
}
Комментарии:
1. откуда вы берете свой
Response
?2. @Tomo Я могу рассказать это для своего примера: у меня есть приложение MVC5, и я унаследовал его от
System.Web.Mvc.Controller
Ответ №3:
Это работает для меня.
using (var ms = new MemoryStream())
{
using (var document = new Document(PageSize.A4,50,50,15,15))
{
// step 2
PdfWriter writer = PdfWriter.GetInstance(document, ms);
// step 3
document.Open();
// XML Worker
XMLWorker worker = new XMLWorker(css, true);
XMLParser p = new XMLParser(worker);
p.Parse(new StringReader(--Your HTML--));
// step 5
document.Close();
}
Byte[] FileBuffer = ms.ToArray();
if (FileBuffer != null)
{
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", FileBuffer.Length.ToString());
Response.BinaryWrite(FileBuffer);
}
}