PdfSharp和MigraDoc渲染字体没有间距

时间:2014-12-20 17:00:06

标签: asp.net pdf fonts pdfsharp migradoc

我正在使用PdfSharp和MigraDoc功能的组合生成PDF。此生成器托管在ASP.NET MVC应用程序中。

在这个测试代码中,我根据他们的名字渲染了5种不同的字体。第一个," House M.D。"仅存在于我的机器上,并且不存在于服务器上。我用它作为对照。

接下来的三种字体(Helvetica变体)是我关心的并且想要在我的实际输出中使用。

最后一种字体("垃圾 - 这不是真正的字体名称")是服务器上或我的机器上不存在的字体。我刚刚完成了。它也是一种控制。

所有字体都是TTF字体。

当我在本地计算机上运行时(无论是在开发网络服务器中还是在IIS中),我都得到了预期的结果:

enter image description here

当我从服务器运行完全相同的代码时,我得到一个完全不同的结果,使用了错误的字体,并且单词之间的间距完全消失了:

enter image description here

以下是我用来生成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;
    }
}

我做错了什么?为什么我不能在服务器上呈现这些字体?

1 个答案:

答案 0 :(得分:2)

所以,这是一个“答案”,但它不是一个很好的答案。

我刚刚重新启动机器(自安装字体后我没有这样做)现在可以正常工作。

已经停止并启动了IIS,完成了IISRESET以及其他各种事情。但是没有重新启动。

我刚刚重新启动它并且有效。