背景:
我有以编程方式生成的 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 建议的解决方法(“Reporting Services 何时执行字体嵌入”下的 Link)是对 PDF 进行后处理以手动嵌入字体。
目标 获取一个已经生成的 PDF 文档,以编程方式“打开”它并嵌入字体,重新保存 PDF。
方法 我被指向 iTextSharp,但大多数示例都是针对 Java 版本的,我在转换为 iTextSharp 版本时遇到了问题(我找不到任何 iTextSharp 的文档)。
我正在为我需要做的事情写这篇文章:Itext embed font in a PDF .
但是对于我来说,我似乎无法使用 ByteArrayOutputStream 对象。它似乎无法找到它。我研究了又研究,但似乎没有人说出它在哪个类中或我在哪里找到它,所以我可以将它包含在 using 语句中。我什至破解了 Reflector,但似乎无法在任何地方找到它。
这是我目前所拥有的,它可以编译等等。 (结果是我生成的 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)。
最佳答案
这可能不是您正在寻找的答案(因为您希望以编程方式解决问题,而不是通过外部工具)。
但是您可以使用 Ghostscript 命令行嵌入丢失的字体,以回顾未嵌入字体的 PDF:
gs \
-sFONTPATH=/path/to/fonts:/another/dir/with/more/fonts \
-o output-pdf-with-embedded-fonts.pdf \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
input-pdf-where-some-fonts-are-not-embedded.pdf
重要的是丢失的字体都在 -sFontPath=...
开关指向的目录之一中可用。
关于c# - 如何在现有 PDF 中嵌入字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4231656/