我正在使用PdfSharp和MigraDoc功能的组合生成PDF。此生成器托管在ASP.NET MVC应用程序中。
在这个测试代码中,我根据他们的名字渲染了5种不同的字体。第一个," House M.D。"仅存在于我的机器上,并且不存在于服务器上。我用它作为对照。
接下来的三种字体(Helvetica变体)是我关心的并且想要在我的实际输出中使用。
最后一种字体("垃圾 - 这不是真正的字体名称")是服务器上或我的机器上不存在的字体。我刚刚完成了。它也是一种控制。
所有字体都是TTF字体。
当我在本地计算机上运行时(无论是在开发网络服务器中还是在IIS中),我都得到了预期的结果:
当我从服务器运行完全相同的代码时,我得到一个完全不同的结果,使用了错误的字体,并且单词之间的间距完全消失了:
以下是我用来生成PDF的代码(请注意,这只是我为复制问题而创建的测试项目中的测试代码):
public byte[] GeneratePdf()
{
var pdfOut = new PdfDocument();
pdfOut.Info.Title = "Test Pdf";
pdfOut.AddPage();
using (var xgraphics = XGraphics.FromPdfPage(pdfOut.Pages[0]))
{
xgraphics.MFEH = PdfFontEmbedding.Always;
var migraDoc = new Document();
Section section = migraDoc.AddSection();
var table = section.AddTable();
table.AddColumn(new Unit(pdfOut.Pages[0].Width.Point/2));
var fonts = new List<string>()
{
"House M.D.",
"HelveticaLTPro-Condensed",
"HelveticaLTPro-BoldCond",
"HelveticaLTPro-CondensedObl",
"Garbage - this is not a real font name"
};
foreach (string fontName in fonts)
{
var mfont = new Font(fontName, 8);
Row bodyRow = table.AddRow();
var r3 = bodyRow.Cells[0].AddParagraph();
var ft = r3.AddFormattedText(fontName, mfont);
if (fontName.Contains("Bold")) ft.Bold = true;
}
var renderer = new DocumentRenderer(migraDoc);
renderer.PrepareDocument();
renderer.RenderObject(xgraphics, 10, 100, pdfOut.Pages[0].Width.Point, table);
var ms = new MemoryStream();
pdfOut.Save(ms);
return ms.ToArray();
}
}
并且,如果重要,这里是调用上述代码的WebApi控制器:
[RoutePrefix("api/preview")]
public class PdfController : ApiController
{
[Route("")]
//[CacheOutput(ClientTimeSpan = 14400, ServerTimeSpan = 14400)]
public HttpResponseMessage Get()
{
var generator = new PdfGenerator();
byte[] pdfBytes = generator.GeneratePdf();
var ms = new MemoryStream(pdfBytes);
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(ms);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return response;
}
}
我做错了什么?为什么我不能在服务器上呈现这些字体?
答案 0 :(得分:2)
所以,这是一个“答案”,但它不是一个很好的答案。
我刚刚重新启动机器(自安装字体后我没有这样做)现在可以正常工作。
我已经停止并启动了IIS,完成了IISRESET以及其他各种事情。但是没有重新启动。
我刚刚重新启动它并且有效。