Я использую ABCPDF для печати файла PDF на локальном принтере через файл EMF. Я очень близко основал это на примере проекта ABC PDF "ABCPDFView". Мое приложение отлично работало на моих устройствах разработки для Windows 7 и Windows XP, но когда я перешел на тестовую версию Windows 2003, простые встроенные шрифты (такие как Times New Roman 12) отображались совершенно неправильно (неправильное место, короткие и приземистые, почти как DPI были безумно неправы).
Обратите внимание, что я жестко закодировал DPI до 240 здесь, потому что я использую странный драйвер печати для мэйнфрейма, который использует 240x240. Я могу сбрасывать со счетов этот драйвер как виновника, поскольку, если я сохраняю файл EMF локально во время печати, он показывает те же проблемы макета. Если я выполняю рендеринг в файлы PNG или TIFF, то на всех моих серверах это выглядит отлично, используя тот же код (вместо .emf вместо .emf). Наконец, если я использую проект ABCPDFView, чтобы вручную добавить случайное текстовое поле в мой PDF, этот текст также отображается неправильно в файле EMF. (Примечание: если я распечатываю PDF с помощью Acrobat, текст отображается очень хорошо)
Обновление: я упустил полезный момент для тех, кто имеет эту проблему. Я могу обойти эту проблему, установив RenderTextAsText в «0» (см. Код ниже). Это заставляет ABCPDF отображать текст в виде многоугольников и устраняет проблему. Однако это не очень удачное решение, так как оно значительно увеличивает размер моих файлов EMF, и эти полигоны не выглядят так же чисто в моем окончательном печатном документе.
У кого-нибудь есть мысли о причинах этой странной проблемы со шрифтами?
private void DoPrintPage(object sender, PrintPageEventArgs e)
{
using (Graphics g = e.Graphics)
{
//... omitted code to determine the rect, used straight from ABC PDF sample
mDoc.Rendering.DotsPerInch = 240 ;
mDoc.Rendering.ColorSpace = "RGB";
mDoc.Rendering.BitsPerChannel = 8;
mDoc.SetInfo(0, "RenderTextAsText", "0");//the magic is right here
byte[] theData = mDoc.Rendering.GetData(".emf");
using (MemoryStream theStream = new MemoryStream(theData))
{
using (Metafile theEMF = new Metafile(theStream))
{
g.DrawImage(theEMF, theRect);
}
}
//... omitted code to move to the next page
}