0

プロジェクトでは、PDF ドキュメントを 2 つのドキュメントに分割する必要があります。

このジョブでは、PdfReaderを使用してソース ファイルを読み取り、2 つのpdfCopyオブジェクト (1 つは空白ページ ドキュメント用、もう 1 つはコンテンツ ドキュメントを含むページ用) を使用してファイルを書き込みます。

GetImportedPageを使用してPdfImportedPageを読み取り、それをPdfCopyライターの 1 つに追加します。

問題は次のとおりです。ソース ファイルが「タグ付き PDF 形式」を使用しています。これを維持するために (これは絶対に必要です)、両方のPdfCopyライターでSetTagged()メソッドを使用し、 GetImportedPage(...)で追加の 3 番目のパラメーターを使用してタグ付きの形式を維持します。ただし、PdfCopyライターでAddPage(...)を呼び出すと、無効なキャスト例外が発生します。

タイプ 'iTextSharp.text.pdf.PdfDictionary' のオブジェクトをタイプ 'iTextSharp.text.pdf.PRIndirectReference' にキャストできません。

誰でもこれを解決する方法について何か考えがありますか? ヒントはありますか?また、プロジェクトは現在、itext ライブラリのバージョン 5.1.0.0 を参照しています。5.4.4.0 では、GetImportedPage の 3 番目のパラメーターはもう存在しないようです。

以下に、コードの抜粋を示します。

iTextSharp.text.Document targetPdf = new iTextSharp.text.Document();
iTextSharp.text.Document blankPdf = new iTextSharp.text.Document();

iTextSharp.text.pdf.PdfReader sourcePdfReader = new iTextSharp.text.pdf.PdfReader(inputFile);

iTextSharp.text.pdf.PdfCopy targetPdfWriter = new iTextSharp.text.pdf.PdfSmartCopy(targetPdf, new FileStream(outputFile, FileMode.Create));
iTextSharp.text.pdf.PdfCopy blankPdfWriter = new iTextSharp.text.pdf.PdfSmartCopy(blankPdf, new FileStream(blanksFile, FileMode.Append));

targetPdfWriter.SetTagged();
blankPdfWriter.SetTagged();

try
{
    iTextSharp.text.pdf.PdfImportedPage page = null;
    int n = sourcePdfReader.NumberOfPages;

    targetPdf.Open();
    blankPdf.Open();

    blankPdf.Add(new iTextSharp.text.Phrase("This document contains the blank pages removed from " + inputFile));
    blankPdf.NewPage();

    for (int i = 1; i <= n; i++)
    {
        byte[] pageBytes = sourcePdfReader.GetPageContent(i);
        string pageText = "";
        iTextSharp.text.pdf.PRTokeniser token = new iTextSharp.text.pdf.PRTokeniser(new iTextSharp.text.pdf.RandomAccessFileOrArray(pageBytes));
        while (token.NextToken())
        {
            if (token.TokenType == iTextSharp.text.pdf.PRTokeniser.TokType.STRING)
            {
                pageText += token.StringValue;
            }
        }

        if (pageText.Length >= 15)
        {
            page = targetPdfWriter.GetImportedPage(sourcePdfReader, i, true);
            targetPdfWriter.AddPage(page);
        }
        else
        {
            page = blankPdfWriter.GetImportedPage(sourcePdfReader, i, true);
            blankPdfWriter.AddPage(page);
            blankPageCount++;
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine("Exception at LOC1: " + ex.Message);
}

targetPdfWriter.AddPage(page);の呼び出しでエラーが発生します。コードサンプルの終わり近く。

ご助力ありがとうございます。

公苑。

4

0 に答える 0