Шрифт PdfSharp и MigraDoc Rendering без пробелов

Я создаю PDF-файл, используя комбинацию функций PdfSharp и MigraDoc. Этот генератор размещается в приложении ASP.NET MVC.

В этом тестовом коде я визуализирую 5 разных шрифтов на основе их названий. Первый, «Доктор Хаус». существует только на моей машине и НЕ существует на сервере. Я использую его в качестве контроля.

Следующие три шрифта (разновидности Helvetica) мне небезразличны и я хочу использовать их в своих реальных выводах.

Последний шрифт («Garbage — это не настоящее название шрифта») — это шрифт, которого нет на сервере ИЛИ на моей машине. Я только что выдумал. Это тоже контроль.

Все шрифты являются шрифтами 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;
    }
}

Что я делаю неправильно? Почему я не могу заставить эти шрифты отображаться на сервере?


person CleverPatrick    schedule 20.12.2014    source источник


Ответы (1)


Итак, это «ответ», но он не очень хороший.

Я только что перезагрузил машину (я не делал этого с момента установки шрифтов), и теперь она работает.

Ранее я останавливал IIS, выполнял IISRESET и другие действия. Но не перезагружался.

Я просто перезагрузился и все заработало.

person CleverPatrick    schedule 20.12.2014
comment
Ну что вы знаете, я бы никогда не подумал попробовать это, но это было именно то, что нужно было сделать. В моем случае кернинг был испорчен только для одного нового шрифта, который я только что установил. PdfSharp использовал правильный шрифт, но с очень неправильным интервалом. Кроме того, консольная программа с точно таким же кодом выдавала правильный интервал; был затронут только код, работающий под IIS. Перезагрузка исправил. - person Roman Starkov; 14.03.2016