Eu tenho este código de demonstração para o 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();
Como faço para que o controlador retorne o documento pdf ao navegador?
EDITAR:
A execução desse código abre o Acrobat, mas recebo uma mensagem de erro "O arquivo está danificado e não pôde ser reparado"
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");
}
Alguma idéia de por que isso não funciona?
c#
asp.net
asp.net-mvc
pdf
itextsharp
Tony Borf
fonte
fonte
Respostas:
Retornar a
FileContentResult
. A última linha na ação do seu controlador seria algo como:Se você estiver gerando este PDF dinamicamente, pode ser melhor usar ae
MemoryStream
criar o documento na memória em vez de salvar em arquivo. O código seria algo como:fonte
Eu consegui trabalhar com esse código.
fonte
using
declaração em nenhum exemplo que eu possa encontrar ... Não é necessário aqui? Acho que você tem pelo menos 3 objetos descartáveis ...Você deve especificar:
Para que o arquivo seja aberto diretamente no navegador em vez de ser baixado
fonte
Se você retornar um
FileResult
do seu método de ação e usar oFile()
método de extensão no controlador, é fácil fazer o que deseja. Existem substituições noFile()
método que utilizará o conteúdo binário do arquivo, o caminho para o arquivo ou aStream
.fonte
Encontrei problemas semelhantes e me deparei com uma solução. Eu usei dois postes, um de pilha que mostra o método para retornar para download e outro um que mostre uma solução de trabalho para iTextSharp e MVC.
fonte
Você pode criar uma classe personalizada para modificar o tipo de conteúdo e adicionar o arquivo à resposta.
http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx
fonte
Sei que essa pergunta é antiga, mas pensei em compartilhar isso, pois não consegui encontrar nada parecido.
Eu queria criar minhas visualizações / modelos normalmente usando o Razor e processá- las como PDFs .
Dessa forma, eu tinha controle sobre a apresentação em pdf usando a saída html padrão em vez de descobrir como fazer o layout do documento usando o iTextSharp.
O projeto e o código-fonte estão disponíveis aqui com instruções de instalação de nuget:
https://github.com/andyhutch77/MvcRazorToPdf
fonte
FileStreamResult
certamente funciona. Mas se você olhar para o Microsoft Docs , ele herdará deActionResult -> FileResult
, que possui outra classe derivadaFileContentResult
. "Envia o conteúdo de um arquivo binário para a resposta". Portanto, se você já possui obyte[]
, você deve apenas usarFileContentResult
.fonte
Você normalmente faria um Response.Flush seguido de um Response.Close, mas por algum motivo a biblioteca iTextSharp não parece gostar disso. Os dados não passam e a Adobe acha que o PDF está corrompido. Deixe de fora a função Response.Close e veja se seus resultados são melhores:
fonte
se o nome do arquivo estiver gerando dinamicamente, como definir o nome do arquivo aqui, será gerado através do guid aqui.
fonte
Ver pagina:
Controlador de digitalização:
fonte