PDFファイルからいくつかのフォントストリームを取り出そうとしています(私の会社はこれらのドキュメントを元の方法で表示する権利を支払っているため、合法性は問題ではありません-これにはフォントの抽出を必要とする変換が必要です) .
今、私はMUToolを使用していましたが、pdfの画像も抽出し、それらをバイパスする方法はなく、これらのいくつかには数万の画像が含まれています。それで、私は答えを求めてウェブに行き、次の解決策にたどり着きました:
すべてのフォントをフォント ディクショナリに取得し、次のコードを使用してそれらを PdfStreams に変換しようとします (flatedecode とファイルへの書き込み用)。
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject((PdfObject)cItem.pObj);
PdfName type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
try
{
int xrefIdx = ((PRIndirectReference)((PdfObject)cItem.pObj)).Number;
PdfObject pdfObj = (PdfObject)reader.GetPdfObject(xrefIdx);
PdfStream str = (PdfStream)(pdfObj);
byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)str);
}
catch { }
しかし、PdfStream str = (PdfStream)(pdfObj);に到達すると、以下のエラーが表示されます。
Unable to cast object of type 'iTextSharp.text.pdf.PdfDictionary'
to type 'iTextSharp.text.pdf.PdfStream'.
今、私は PdfDictionary が PdfObject から派生 (拡張) していることを知っているので、ここで何が間違っているのかわかりません。誰か助けてください - このコードにパッチを当てることについてアドバイスが必要か、完全に間違っている場合は、ストリームを適切に抽出するためのコードか、そのコードのある場所への指示が必要です。
ありがとうございました。
編集 私の改訂されたコードはここにあります:
public static void GetStreams(PdfReader pdf)
{
int page_count = pdf.NumberOfPages;
for (int i = 1; i <= page_count; i++)
{
PdfDictionary pg = pdf.GetPageN(i);
PdfDictionary fObj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.FONT));
if (fObj != null)
{
foreach (PdfName name in fObj.Keys)
{
PdfObject obj = fObj.Get(name);
if (obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
PdfName type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
int xrefIdx = ((PRIndirectReference)obj).Number;
PdfObject pdfObj = pdf.GetPdfObject(xrefIdx);
if (pdfObj == null && pdfObj.IsStream())
{
PdfStream str = (PdfStream)(pdfObj);
byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)str);
}
}
}
}
}
}
しかし、私はまだ同じエラーを受け取っているので、これはフォント ストリームを取得する方法が間違っていると思います。同じドキュメントには、muTool を使用して正常に抽出されたフォントが含まれているため、問題は PDF ではなく私にあることがわかります。