Я использую ABCPDF для печати файла PDF на локальном принтере через файл EMF. Я основал это очень близко к проекту ABC PDF «Проект ABCPDFView». Мое приложение отлично работало в моих ящиках Windows 7 и Windows XP, но когда я перешел на тестовый ящик Windows 2003, простые встроенные шрифты (например, Times New Roman 12) оказались абсолютно неправильными (неправильное место и короткие и приземистые, почти как ДПИ безумно ошибались).Формат печати шрифтов ABCPDF - зависимый от машины
Обратите внимание, что я жестко закодировал DPI для 240 здесь. B/c. Я использую странный драйвер для печати мэйнфреймов, который заставляет 240x240. Я могу оспорить этот драйвер в качестве виновника, поскольку, если я сохраню файл EMF локально во время печати, он будет показывать те же проблемы с макетом. Если я передаю PNG или TIFF-файлы, это выглядит очень хорошо на всех моих серверах, используя этот же код (поместите .png вместо .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
}
Таким образом, я проснулся до более точной причины этой ошибки. Оказывается, что Remote Desktop был виновником. На любом сервере, где у меня RDP в этой проблеме, никого, где я этого не делаю, нет. – Dave