ABCPDF Схема печати шрифтов - зависит от машины - PullRequest
3 голосов
/ 22 ноября 2011

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

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

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

0 голосов
/ 28 ноября 2011

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

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

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

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

...