Макет печати шрифта ABCPDF — зависит от машины

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

person Dave    schedule 22.11.2011    source источник
comment
Поэтому я углубился в более точную причину этой ошибки. Оказывается, виноват был удаленный рабочий стол. На любом сервере, на котором я использую RDP, есть эта проблема, на любом, на котором я не работаю, ее нет.   -  person Dave    schedule 28.11.2011


Ответы (2)


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

person TheAlbear    schedule 06.12.2011
comment
Это рендеринг PDF в EMF, я думаю, что рендеринг, о котором вы говорите, предназначен только для файлов HMTL (хотя я могу ошибаться). К сожалению, у нас есть лицензия на 7, и я не уверен, что на данный момент есть финансирование для обновления, хотя мы, безусловно, будем помнить об этом. Спасибо! - person Dave; 07.12.2011

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

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

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

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

person Dave    schedule 28.11.2011