c# - 如何在现有 PDF 中嵌入字体?

标签 c# pdf itext ghostscript embedded-fonts

背景:

我有以编程方式生成的 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/

相关文章:

c# - 可以从线程调用返回类型为列表的方法吗

c# - 在 C# 中向 SQLite 数据库添加大量数据

c# - 在代码隐藏方法中访问 Repeater.Item.Count 值

c# - 在 C# 中检查打印机状态?

iphone - 显示带有视频和链接的 PDF

python - 使用 Python 3.4 提取 PDF 数据

coldfusion - 在 ColdFusion 中使用不同版本的 iText

java - 如何在itext中添加图像和文字的同时在新页面中添加文字

java - Itext GifImage 第一个输入流未关闭

c# - 使用c#或者vb.net获取最终生成的html源码