使用iTextSharp保存文件PDF文件中使用的字体

时间:2010-01-22 17:10:46

标签: c# .net pdf fonts itextsharp

这几乎与this unanswered question重复,但希望知情人士现在正在观看并且可以提供帮助。

我正在寻找能够让一些.NET代码将PDF中嵌入的字体提取到字体文件的能力。我目前正在使用iTextSharp,但我对其他.NET库(例如PDFBox,PDF CLown等等)开放。我能够从BaseFont.GetDocumentFonts()迭代信息,但我不清楚如何将字体流式传输到字体文件。

谢谢,肯尼

3 个答案:

答案 0 :(得分:1)

@Highmastdon - 获取字体名称实际上非常简单,至少在iText / iTextSharp(pdfBox也是如此 - 但我现在没有代码)但在iTextSharp中你会做到以下几点: / p>

PdfReader reader = new PdfReader(strFileName);
List<object[]> strFonts = BaseFont.GetDocumentFonts(reader);

就是这样,大多数库都支持写入简单的字体提取(无论如何都是名称)。

答案 1 :(得分:1)

之前我做出了回应,但为了在本网站上添加可靠的例子(三个月前我非常需要的东西),我将重复使用我最终使用的解决方案。

我下载了MuPDF并进入bin文件夹,检索文件mutool.exe。然后我用C#中的单独进程调用它。它通过拉动PDF文件中嵌入的所有字体并将它们转储到包含mutool.exe的文件夹中。然后只是将字体从那里移动到我想要的文件夹中。

        /// <summary>
        /// Extract all fonts from PDF
        /// </summary>
        /// <param name="strPDFName"></param>
        public static void ExtractAll(string strPDFName)
        {
            if (strMUTOOL != null && strFontFinal != null)
            {
                Process p = new Process();
                p.StartInfo.FileName = strMUTOOL;
                p.StartInfo.Arguments = "extract \"" + strPDFName + "\"";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.WorkingDirectory = strMUTOOL.Replace("mutool.exe", "").Trim();

                p.Start();
                p.WaitForExit();

                var standardError = p.StandardError.ReadToEnd();
                var standardOutput = p.StandardOutput.ReadToEnd();
                var exitCode = p.ExitCode;
            }
        }

稍微提醒一下,大多数这些字体都是CFF文件,如果您打算使用它们,则需要转换它们。此外,如上所述,如果这些字体是付费字体,则使用这些字体可能构成软件盗版。最后,这些字体通常只是子集,不包含完整的字形集 - 只是PDF中使用的字形。

答案 2 :(得分:0)

我没有得到答案,但我确实找到了几个基于供应商的解决方案。来自pdf-tools.com的软件pdfextract.exe运行良好。此外,来自quickpdflibrary.com的图书馆也运作良好,是我们去的商家,到目前为止非常高兴。