32

背景:

我有我正在以编程方式生成的 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在“报告服务何时进行字体嵌入”下)是对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)。

4

4 回答 4

37

这可能不是您正在寻找的答案(因为您希望以编程方式解决问题,而不是通过外部工具)。

但是您可以使用 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=...开关指向的目录之一中找到。

于 2010-11-20T18:00:46.347 回答
15

除了 Ghostscript,还可以使用Poppler和 Cairo。pdftocairoPoppler有一个命令可以通过pdftocairo -pdf input.pdf output.pdf. 它还考虑在Fontconfig配置文件中设置的字体替换。如果您的系统上没有 PDF 文件中引用的所有字体,但知道您安装的其他字体是一个好看的替代品,这将非常有用。处理后,嵌入替换字体。

于 2014-12-20T22:44:50.000 回答
1

我今天在上传到 lulu.com 以制作打印副本的现有 PDF 时遇到了这个问题。它因没有嵌入所有字体而被拒绝。

我发现如果我在 Acrobat X 中打开它并保存为 postscript .ps 文件,然后当我在文件资源管理器中双击这个 .ps 文件时,它会在 Acrobat X Distiller 中打开,这会自动创建一个包含所有字体的新 PDF 文件嵌入!

当然,这意味着您必须拥有计算机上所需的所有字体。否则,像 InFix 这样的程序可以进行字体替换。

于 2020-01-16T20:11:00.940 回答
0

我在带有提交给 IEEE 的 PDF 的 Mac 上遇到了这个问题。使用 Adob​​e Reader 和 Preview,我能够解决这个问题。如果您在 PC 上,我认为任何 pdf 打印机都可以代替 Preview。

这是我采取的步骤。您可以单独修复每个图形,或修复整个文档。

  1. 使用 Adob​​e Reader 打开 PDF 文件。

  2. 右键单击图像,然后单击“文档属性”。</p>

  3. 点击“字体”。检查字体是否未嵌入。应该说“Courier”或其他字体名称。

  4. 如果您的 pdf 不是标准页面大小,请单击“说明”并查看页面大小。把这个写下来。前任。19.4 x 5.22 英寸

  5. 在预览中打开 pdf。转到文件-> 打印。如果使用非标准页面大小的 pdf,请单击纸张大小并选择自定义。您将需要创建一个与您在第 4 步中记下的大小相等的自定义页面大小。不要忘记将所有边的边距归零为 0。之后,您需要将打印对话框中的打印比例设置为 100%。

  6. 在打印对话框的左下方(在 Mac 上的预览中),单击“PDF”将 PDF 打印为新的 PDF。选择目的地并打印。

  7. 在 Adob​​e Reader 中打开新的 pdf 并验证字体现在是否已嵌入。

我希望这有帮助。

于 2019-05-14T23:32:20.113 回答