将“已标记”的PDF文档拆分为多个文档,并保留标记

时间:2013-11-11 09:46:59

标签: pdf itextsharp

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

对于这项工作,我使用 PdfReader 来阅读源文件,以及两个 pdfCopy 对象(一个用于空白页文档,一个用于带有内容文档的页面)将文件写入。

我使用 GetImportedPage 来阅读 PdfImportedPage ,然后将其添加到其中一个 PdfCopy 作家。

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

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

任何人对如何解决这个问题都有任何想法?任何提示? 另外:该项目目前引用了版本5.1.0.0的itext库。在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(页面); 调用中发生错误。

非常感谢你的帮助。

柯恩。

0 个答案:

没有答案