在项目中,我必须将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(页面); 调用中发生错误。
非常感谢你的帮助。
柯恩。