2011-11-22 4 views
3

Я использую 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 
     } 
+0

Таким образом, я проснулся до более точной причины этой ошибки. Оказывается, что Remote Desktop был виновником. На любом сервере, где у меня RDP в этой проблеме, никого, где я этого не делаю, нет. – Dave

ответ

0

Я был первоначально RDPing в с разрешением 1920х1080, путем переключения на 1024x768 разрешении на ПРР, проблема ушла. Моя основная программа работает как служба, и запуск этой службы из сеанса RDP с разрешением 1024x768 исправляет ее.

У меня есть электронная почта из ABC PDF, чтобы узнать, могут ли они объяснить это и предложить более элегантное решение, но пока это работает.

Обратите внимание, что это ABC PDF 7, я не знаю, относится ли эта проблема к другим версиям.

Обновление: поддержка ABC PDF подтвердила, что ее возможная служба кэширует разрешение экрана от человека, который начал процесс. Они подтвердили, что они видели некоторые другие странные проблемы с Remote Desktop и рекомендовали мне использовать это обходное решение 1024x768 и/или запустить службу удаленно.

0

Попробуйте перейти на новую версию abcpdf 8, у нее есть собственный механизм рендеринга на основе Gecko, поэтому вы можете обойти такие проблемы, когда abcpdf использует встроенную версию IE для рендеринга.

+0

Это рендеринг PDF в EMF, я * думаю * рендеринг, о котором вы говорите, предназначен только для файлов HMTL (я мог ошибаться, хотя). К сожалению, у нас есть лицензия на 7, и я не уверен, что финансирование там будет улучшено на данный момент, хотя это, безусловно, что-то мы будем иметь в виду. Благодаря! – Dave

Смежные вопросы