【发布时间】:2011-05-13 00:17:33
【问题描述】:
背景:
我有以编程方式生成的 PDF。我需要能够将 PDF 从服务器直接发送到打印机(而不是通过中间应用程序)。目前我可以执行上述所有操作(生成 PDF,发送到打印机),但由于字体未嵌入到 PDF 中,打印机正在执行字体替换。
为什么字体在生成时没有嵌入:
我正在使用 SQL Reporting Services 2008 创建 PDF。SQL Reporting Services 存在一个已知问题,即它不会嵌入字体(除非满足一系列要求 - http://technet.microsoft.com/en-us/library/ms159713%28SQL.100%29.aspx)。不要问我为什么,PDF 符合 MS 列出的所有要求,并且字体仍然显示为未嵌入 - 无法真正控制字体是否被嵌入,所以我接受了这不起作用并继续前进. Microsoft 建议的解决方法(http://blogs.msdn.com/b/donovans/archive/2007/07/20/reporting-services-pdf-renderer-faq.aspx 在“Reporting Services 何时进行字体嵌入”下)是对 PDF 进行后处理以手动嵌入字体。
目标 获取一个已经生成的 PDF 文档,以编程方式“打开”它并嵌入字体,重新保存 PDF。
接近 我被指向 iTextSharp,但大多数示例都是针对 Java 版本的,我在转换为 iTextSharp 版本时遇到了麻烦(我找不到任何 iTextSharp 文档)。
我正在写这篇文章以完成我需要做的事情:Itext embed font in a PDF。
但是,在我的一生中,我似乎无法使用 ByteArrayOutputStream 对象。它似乎找不到它。我进行了研究和研究,但似乎没有人说它在哪个类或我在哪里找到它,所以我可以将它包含在 using 语句中。我什至破解了打开的反射器,但似乎在任何地方都找不到。
这是我到目前为止所拥有的,它可以编译等等。 (结果是我生成的 PDF 的 byte[])。
PdfReader pdf = new PdfReader(result);
BaseFont unicode = BaseFont.CreateFont("Georgia", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// the next line doesn't work as I need a ByteArrayOutputStream variable to pass in
PdfStamper stamper = new PdfStamper(pdf, MISSINGBYTEARRAYOUTPUTSTREAMVARIABLE);
stamper.AcroFields.SetFieldProperty("test", "textfont", unicode, null);
stamper.Close();
pdf.Close();
那么任何人都可以帮助我使用 iTextSharp 将字体嵌入 PDF 或指出正确的方向吗?
我非常乐意使用除 iTextSharp 之外的任何其他解决方案来完成此目标,但它必须是免费的并且能够被企业用于内部应用程序(即 Affero GPL)。
【问题讨论】:
-
能否给出需要嵌入的字体名称? (某些字体确实具有不允许嵌入的许可证,并且大多数 PDF 处理或创建软件确实尊重字体文件中的相应标志并选择不嵌入它们......)
-
当然! Georgia 和 Calibri - 我检查了我们是否有 TrueType 版本,并且(根据 Windows)它们都将“字体嵌入性”标签设置为“可编辑”——我认为这是正确的设置?感谢您的帮助!
-
对于以后阅读本文的任何人,这两种方法都有效。 SQL Reporting Services 在多次更新/修补程序后最终正确嵌入了字体,并且可以直接发送到打印机。此外,使用 .NET 中的 ProcessInfo 调用 Ghostscript 可以对 PDF 进行后处理。
标签: c# pdf itextsharp ghostscript embedded-fonts