这在本地运行时在ASP.NET MVC应用程序中有效,但在Azure上部署时不:
Document doc = new Document();
Section section = doc.AddSection();
section.AddParagraph("Some text to go into a PDF");
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always);
pdfRenderer.Document = doc;
pdfRenderer.RenderDocument();
System.IO.MemoryStream stream = new System.IO.MemoryStream();
pdfRenderer.PdfDocument.Save(stream, false);
Byte[] documentBytes = stream.ToArray();
return File(documentBytes, "application/pdf");
在本地,我得到了一个不错的PDF。在Azure上,我得到一个空白的PDF。我没有看到任何抛出的异常或其他错误消息。我找到了一些SO答案,说明PDF的GDI版本在Azure上不起作用,所以我使用的是WPF版本 - 结果相同。
我发现了这个问题,但我不清楚如何将其应用于MVC应用:Why is MigraDoc generating a blank pdf in my asp.net application?
对不起,如果这是一个显而易见的问题,我只是被卡住了!
答案 0 :(得分:2)
如果完整的PDF到达客户端,可能会出现字体问题(我在评论中要求确认但尚未得到答案)。
PDFsharp必须能够访问TTF文件才能提取信息。您在%windir%\ fonts文件夹中使用的字体是否具有读取它们的权限?
Azure是IFontResolver的候选者,因为缺少许多字体,通常不会授予权限。
使用IFontResolver,您可以使用PDFsharp直接访问TTF文件(如byte [])。
您可以将我的EZFontResolver类用于此目的:
http://developer.th-soft.com/developer/2015/12/11/ezfontresolver-a-generic-font-resolver-for-pdfsharp-and-migradoc/
我还有一个示例,展示了如何实现自己的IFontResolver:
http://developer.th-soft.com/developer/2015/09/21/using-private-fonts-with-pdfsharp-1-50-beta-2-or-migradoc/
答案 1 :(得分:-2)
可能是因为Azure处理内存流的方式不同。我建议在写入流之前寻找流的开头(stream.Seek(0, SeekOrigin.Begin)
),并使用重载File(Stream, string)
(MemoryStream
继承Stream
,这样你就可以直接传递它了)
如果有帮助,请告诉我。