PDF ファイルから埋め込みフォントを抽出する C# コードを作成することができました。TrueType フォントが埋め込まれたドキュメントでテストしています。
問題は、フォントバイトをファイルに書き込むときに、破損しているように見えるため、フォントビューアーで開くことができないことです。
面白いことに、MuPDF mutool.exe extract
を実行すると、まったく同じファイルが同じ結果 (破損した .ttf ファイル) で得られるため、コードはまったく問題ないように見えます。
コードは次のとおりです(申し訳ありませんが、かなり大きいですが、これを達成するためのより短い方法は今のところ見つかりませんでした):
public void ExtractFonts(PdfReader reader, PdfParserDocument document)
{
foreach (var fontData in BaseFont.GetDocumentFonts(reader))
{
// Get font name and indirect reference
var name = (string)fontData[0];
var reference = (PRIndirectReference)fontData[1];
// Get font bytes from PDF
var XrefIndex = Convert.ToInt32(reference.Number.ToString(System.Globalization.CultureInfo.InvariantCulture));
var fontDictionary = (PdfDictionary)reader.GetPdfObject(XrefIndex);
var fontDescriptor = fontDictionary.GetAsDict(PdfName.FONTDESCRIPTOR);
PRIndirectReference fontBytesReference = null;
if (fontDescriptor != null)
{
if (fontDescriptor.Get(PdfName.FONTFILE) != null)
{
fontBytesReference = (PRIndirectReference)fontDescriptor.Get(PdfName.FONTFILE);
}
else if (fontDescriptor.Get(PdfName.FONTFILE2) != null)
{
fontBytesReference = (PRIndirectReference)fontDescriptor.Get(PdfName.FONTFILE2);
}
else if (fontDescriptor.Get(PdfName.FONTFILE3) != null)
{
fontBytesReference = (PRIndirectReference)fontDescriptor.Get(PdfName.FONTFILE3);
}
}
// Only add embedded fonts
if (fontBytesReference != null)
{
var fontBytesReferenceIndex = Convert.ToInt32(fontBytesReference.Number.ToString(System.Globalization.CultureInfo.InvariantCulture));
var pdfObject = reader.GetPdfObject(fontBytesReferenceIndex);
var pdfStream = (PdfStream)pdfObject;
var bytes = PdfReader.FlateDecode(PdfReader.GetStreamBytesRaw((PRStream)pdfStream));
// Write to file
using (var file = File.OpenWrite(name + ".ttf"))
{
file.Write(bytes, 0, bytes.Length);
}
}
}
}