我正在使用 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
}