Itextsharp Показать PDF в браузере, а не сохранять [дубликат]

Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

30
задан John Saunders 12 May 2010 в 03:31
поделиться

4 ответа

Переключить поток с помощью запоминающего устройства.

MemoryStream memStream = new MemoryStream();
PdfWriter wri = PdfWriter.GetInstance(doc, memStream);
...
return memStream.ToArray();
28
ответ дан Mikael Svenson 26 August 2018 в 06:58
поделиться
  • 1
    Как это работает для iText 7? – Anokrize 2 August 2018 в 20:59
  • 2
    Как вы получаете содержимое memoryStream для показа в PDF-ридере без создания файла? – Osprey 14 August 2018 в 15:25

Я раньше не использовал iTextPDF, но это звучало интересно, поэтому я взял на себя вызов и сделал некоторые исследования самостоятельно. Вот как передать документ PDF через память.

protected void Page_Load(object sender, EventArgs e)
{
    ShowPdf(CreatePDF2());
}

private byte[] CreatePDF2()
{
    Document doc = new Document(PageSize.LETTER, 50, 50, 50, 50);

    using (MemoryStream output = new MemoryStream())
    {
        PdfWriter wri = PdfWriter.GetInstance(doc, output);
        doc.Open();

        Paragraph header = new Paragraph("My Document") {Alignment = Element.ALIGN_CENTER};
        Paragraph paragraph = new Paragraph("Testing the iText pdf.");
        Phrase phrase = new Phrase("This is a phrase but testing some formatting also. \nNew line here.");
        Chunk chunk = new Chunk("This is a chunk.");

        doc.Add(header);
        doc.Add(paragraph);
        doc.Add(phrase);
        doc.Add(chunk);

        doc.Close();
        return output.ToArray();
    }

}

private void ShowPdf(byte[] strS)
{
    Response.ClearContent();
    Response.ClearHeaders();
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now);

    Response.BinaryWrite(strS);
    Response.End();
    Response.Flush();
    Response.Clear();
}
14
ответ дан Dennis Rongo 26 August 2018 в 06:58
поделиться

Если ваш код имеет new FileStream, перейдите в MemoryStream, который вы уже создали. (Не просто создайте его встроенным в вызове PdfWriter.GetInstance - вы захотите иметь возможность ссылаться на него позже.)

Затем вызовите ToArray() на MemoryStream, когда вы закончили писать, чтобы получить byte[]:

using (MemoryStream output = new MemoryStream())
{
    PdfWriter wri = PdfWriter.GetInstance(doc, output);

    // Write to document
    // ...
    return output.ToArray();
}

Я не использовал iTextSharp, но я подозреваю некоторые из этих типов IDisposable - и в этом случае вы должны создавать их также в using.

7
ответ дан Jon Skeet 26 August 2018 в 06:58
поделиться
using iTextSharp.text;
using iTextSharp.text.pdf;
Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);

byte[] pdfBytes;
using(var mem = new MemoryStream())
{
    using(PdfWriter wri = PdfWriter.GetInstance(doc, mem)) 
    {
        doc.Open();//Open Document to write
        Paragraph paragraph = new Paragraph("This is my first line using Paragraph.");
        Phrase pharse = new Phrase("This is my second line using Pharse.");
        Chunk chunk = new Chunk(" This is my third line using Chunk.");

        doc.Add(paragraph);

        doc.Add(pharse);

        doc.Add(chunk); 
    }
    pdfBytes = mem.ToArray();
}
20
ответ дан Samuel Neff 26 August 2018 в 06:58
поделиться
  • 1
    PdfWriter не реализует IDisposable, поэтому вы не можете использовать его в инструкции using. Возможно, это только в версии, которую я использую, хотя (5.0.5), поскольку я знаю, что были некоторые изменения класса из версии 4 – musefan 5 January 2012 в 13:49
  • 2
    @musefan, да, в 5.0.5 это так. В текущей версии 5.5, PdfWriter расширяет DocWriter, которая реализует IDocListener, которая расширяет IDisposable. Я не знаю точно, когда IDisposable был добавлен в IDocListener, но это было некоторое время после 5.0.5 и до 5.5.0. – Samuel Neff 1 March 2014 в 01:55
Другие вопросы по тегам:

Похожие вопросы: