Это почти дубликат этого неотвеченного вопроса, но, надеюсь, кто-то в курсе сейчас и может быть полезным.
Я ищу способ, чтобы какой-нибудь .NET-код извлекал шрифт, встроенный в PDF, в файл шрифта. В настоящее время я использую iTextSharp, но я открыт для других библиотек .NET(например, PDFBox, PDF CLown и т.д.). Я могу перебирать информацию из BaseFont.GetDocumentFonts(), но я не понимаю, как передать шрифт в файл шрифта.
Спасибо, Кенни
Я не получил ответа, но нашел несколько решений на основе поставщиков. Программное обеспечение pdf-tools.com, pdfextract.exe работает очень хорошо. Кроме того, библиотека из quickpdflibrary.com работает очень хорошо, и мы являемся вендером, с которым мы пошли, и до сих пор очень счастливы.
Я сделал ответ раньше, но в интересах добавления твердых примеров к темам на этом сайте (что-то, что я ужасно нуждался три месяца назад), я буду проходить через решение, в котором я закончил использование.
Я загрузил MuPDF и зашел в папку bin, извлекая файл mutool.exe. Затем я называю это отдельным процессом в С#. Он проходит через вытягивание всех шрифтов, встроенных в файл 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.
@Highmastdon - на самом деле очень просто получить имена шрифтов, по крайней мере, в iText/iTextSharp (pdfBox, а также - но у меня сейчас нет кода), но в iTextSharp вы бы сделали следующее:
PdfReader reader = new PdfReader(strFileName);
List<object[]> strFonts = BaseFont.GetDocumentFonts(reader);
И там, в большинстве библиотек есть поддержка, написанная для простого извлечения шрифтов (имена в любом случае).