3

我正在使用 ABCPDF 通过 EMF 文件将 PDF 文件打印到本地打印机。我非常密切地基于 ABC PDF 的示例“ABCPDFView”项目。我的应用程序在我的 Windows 7 和 Windows XP 开发盒上运行良好,但是当我转移到 Windows 2003 测试盒时,简单的嵌入字体(如 Times New Roman 12)呈现完全错误(错误的位置,短而蹲,几乎就像DPI 是错误的)。

请注意,我在这里将 DPI 硬编码为 240,b/c 我正在使用一个奇怪的大型机打印驱动程序,它强制 240x240。我可以将该驱动程序视为罪魁祸首,因为如果我在打印期间将 EMF 文件保存在本地,它会显示相同的布局问题。如果我渲染为 PNG 或 TIFF 文件,这在我所有使用相同代码的服务器上看起来都很好(用 .png 代替 .emf)。最后,如果我使用 ABCPDFView 项目手动将随机文本框添加到我的 PDF 中,该文本也会在 EMF 文件中呈现错误。(旁注,如果我使用 Acrobat 打印 PDF,文本呈现得很好)

更新:我为其他遇到此问题的人留下了一个有用的观点。我可以通过将 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
      }
4

2 回答 2

0

我最初使用 1920x1080 分辨率进行 RDP,通过切换到 RDP 的 1024x768 分辨率,问题就消失了。我的主程序作为服务运行,从带有 1024x768 的 RDP 会话启动此服务可以修复它。

我有一封带有 ABC PDF 的电子邮件,看看他们是否可以解释这一点并提供更优雅的解决方案,但目前这可行。

请注意,这是 ABC PDF 7,我不知道这个问题是否适用于其他版本。

更新:ABC PDF 支持确认该服务可能正在缓存启动该过程的人的显示分辨率。他们确认他们已经看到远程桌面的一些其他奇怪问题,并鼓励我使用这个 1024x768 解决方法和/或远程启动服务。

于 2011-11-28T19:49:20.273 回答
0

尝试升级到新版本的 abcpdf 8,它有自己的基于 Gecko 的渲染引擎,因此当 abcpdf 使用 IE 的内置服务器版本进行渲染时,您可以绕过此类问题。

于 2011-12-06T12:26:31.717 回答