在一个项目中,我必须将一个 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); 接近代码示例的末尾。
非常感谢您的帮助。
科恩。