プロジェクトでは、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);の呼び出しでエラーが発生します。コードサンプルの終わり近く。
ご助力ありがとうございます。
公苑。