0

在一个项目中,我必须将一个 PDF 文档拆分为两个文档,一个包含所有空白页面,一个包含所有包含内容的页面。

对于这项工作,我使用PdfReader读取源文件,并使用两个pdfCopy对象(一个用于空白页面文档,一个用于包含内容文档的页面)将文件写入。

我使用GetImportedPage读取PdfImportedPage,然后将其添加到PdfCopy编写器之一。

现在,问题如下:源文件使用的是“标记的 PDF 格式”。为了保留这一点(这是绝对必需的),我在两个PdfCopy编写器上都使用了SetTagged()方法,并使用GetImportedPage(...)中额外的第三个参数来保持标记格式。但是,在PdfCopy 编写器上调用AddPage(...)时,我得到一个无效的强制转换异常:

无法将‘iTextSharp.text.pdf.PdfDictionary’类型的对象转换为‘iTextSharp.text.pdf.PRIndirectReference’。

有人对如何解决这个问题有任何想法吗?有什么提示吗?另外:该项目目前引用了 itext 库的 5.1.0.0 版本。在 5.4.4.0 中,GetImportedPage 的第三个参数似乎不再存在。

下面,您可以找到代码摘录:

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