Я использую ABCPDF для печати файла PDF на локальном принтере через файл EMF. Я основывался на образце проекта ABC PDF "ABCPDFView". Мое приложение отлично работало на моих устройствах разработки Windows 7 и Windows XP, но когда я перешел на тестовое устройство Windows 2003, простые встроенные шрифты (такие как Times New Roman 12) отображались совершенно неправильно (неправильное место, короткие и приземистые, почти как DPI были безумно неправильными).
Обратите внимание, что здесь я жестко запрограммировал DPI на 240, потому что я использую странный драйвер печати для мэйнфреймов, который заставляет 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
}