我正在阅读和写入相同的PDF同时我收到错误“文档没有目录对象(意思是:它是无效的PDF)”这一行“PdfReader pdfReader = new PdfReader(inputPdf2);”在下面的代码段中。
iTextSharp.text.pdf.PdfCopy pdfCopy = null;
Document finalPDF = new Document();
//pdfReader = null;
FileStream fileStream = null;
int pageCount = 1;
int TotalPages = 20;
try
{
fileStream = new FileStream(finalPDFFile, FileMode.OpenOrCreate, FileAccess.Write);
pdfCopy = new PdfCopy(finalPDF, fileStream);
finalPDF.Open();
foreach (string inputPdf1 in inputPDFFiles)
{
if (File.Exists(inputPdf1))
{
var bytes = File.ReadAllBytes(inputPdf1);
PdfReader pdfReader = new PdfReader(bytes);
fileStream = new FileStream(inputPdf1, FileMode.Open, FileAccess.Write);
var stamper = new PdfStamper(pdfReader, fileStream);
var acroFields = stamper.AcroFields;
stamper.AcroFields.SetField(acrofiled.Key, "Page " + 1+ " of " + 16);
stamper.FormFlattening = true;
stamper.Close();
stamper.Dispose();
fileStream.Close();
fileStream.Dispose();
pdfReader.Close();
pdfReader.Dispose();
}
}
foreach (string inputPdf2 in inputPDFFiles)
{
if (File.Exists(inputPdf2))
{
PdfReader pdfReader = new PdfReader(inputPdf2);
int pageNumbers = pdfReader.NumberOfPages;
for (int pages = 1; pages <= pageNumbers; pages++)
{
PdfImportedPage page = pdfCopy.GetImportedPage(pdfReader, pages);
PdfCopy.PageStamp pageStamp = pdfCopy.CreatePageStamp(page);
pdfCopy.AddPage(page);
}
pdfReader.Close();
pdfReader.Dispose();
}
}
pdfCopy.Close();
pdfCopy.Dispose();
finalPDF.Close();
finalPDF.Dispose();
fileStream.Close();
fileStream.Dispose();
请帮助我解决问题或给我任何替代方法
答案 0 :(得分:1)
在第一个循环中,使用如下操作版本覆盖每个文件:
var bytes = File.ReadAllBytes(inputPdf1);
PdfReader pdfReader = new PdfReader(bytes);
fileStream = new FileStream(inputPdf1, FileMode.Open, FileAccess.Write);
var stamper = new PdfStamper(pdfReader, fileStream);
[...]
在此处使用FileMode.Open
是一个错误。您想要用新的文件替换现有文件,对于这样的用例,您必须使用FileMode.Create
或{ {1}}。
使用FileMode.Truncate
会导致原始文件内容保留在那里并写入其中。因此,如果您的新文件内容比原始文件内容短(在展平表单时可能会发生),则新文件会保留原始文件的尾部段。在PDF中,最后有相关的查找信息,因此在阅读这个新文件后,FileMode.Open
会找到旧文件的查找信息,而这些信息根本不会与新内容相匹配。
顺便说一句,您可以像这样创建PdfReader
:
PdfCopy
出于同样的原因,这是错误的:如果那里已有PDF,fileStream = new FileStream(finalPDFFile, FileMode.OpenOrCreate, FileAccess.Write);
pdfCopy = new PdfCopy(finalPDF, fileStream);
就像FileMode.OpenOrCreate
一样,具有上述不良影响。
因此,您应该使用FileMode.Open
替换您写入的流的FileMode
值。