我正在尝试将HTML转换为PDF文件。
我有以下控制器:
public ActionResult Offer([FromBody] DocumentTemplateInvoiceViewModel vm)
{
return this.Pdf(nameof(Offer), vm, "test.pdf");
}
当我在这里进行POST时,我会收回文件,然后就可以打开了。快乐的日子!
但是,如果我尝试执行以下操作:
var termsClient = new RestClient(ConfigurationManager.AppSettings["HostingUrl"]);
var termsRequest = new RestRequest("/Document/Offer", Method.POST);
termsRequest.AddJsonBody(vm);
var json = JsonConvert.SerializeObject(vm);
var termsBytes = termsClient.DownloadData(termsRequest);
File.WriteAllBytes("LOCALPATH",termsBytes );
文件已损坏,我无法打开PDF。它有一些大小,因此它存储了一些字节。可能只是没有正确存储:D
知道我做错了什么吗?为什么来自我的控制器的FileContentResult工作,但是当我下载数据时它会损坏?
答案 0 :(得分:0)
您的问题被标记为MVC,因此我将尝试作为MVC应用程序进行回复。
REST对象似乎表示WEB.API,但也许我错了。 :)
如果您正在谈论FileContentResult,那么我建议您输入ContentType。
var contentType = System.Net.Mime.MediaTypeNames.Application.Pdf;
然后像这样加载FileContentResult:
var fcr = new FileContentResult(ms.ToArray(), contentType); //NOTE: Using a File Stream Result will not work.
fcr.FileDownloadName = FileName;
我看到你正在使用PDF生成,所以这里是我用来为PDF生成FileContentResult的例子:
public FileContentResult CreatePdfFileContentResult()
{
var contentType = System.Net.Mime.MediaTypeNames.Application.Pdf;
using (MemoryStream ms = new MemoryStream())
{
// Create an instance of the document class which represents the PDF document itself.
Document document = new Document(PageSize.A4, 25, 25, 30, 30);
// Create an instance to the PDF file by creating an instance of the PDF
// Writer class using the document and the filestrem in the constructor.
PdfWriter writer = PdfWriter.GetInstance(document, ms);
if (OnPdfMetaInformationAdd != null)
OnPdfMetaInformationAdd(document, DataSource);
// Open the document to enable you to write to the document
document.Open();
if (OnPdfContentAdd != null)
OnPdfContentAdd(document, DataSource);
else throw new NotImplementedException("OnPdfContentAdd event not defined");
// Close the document
document.Close();
// Close the writer instance
writer.Close();
var fcr = new FileContentResult(ms.ToArray(), contentType); //NOTE: Using a File Stream Result will not work.
fcr.FileDownloadName = FileName;
return fcr;
}
}
答案 1 :(得分:0)
事实证明,我是个白痴,问题是完全不同的。端点只返回404错误,该错误刚刚下载并包装到一个文件中(显然它提供了一个损坏的PDF文件)。
所以这段代码完美无缺。看着Fiddler的请求很快就显示出了这个问题。