Я создаю 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;
}
}
Что я делаю неправильно? Почему я не могу заставить эти шрифты отображаться на сервере?