iText CopyAsFormXObject PdfException

iText CopyAsFormXObject PdfException

当我处理我的主要 pdf 文件时,当我到达第 2 页时,我开始阅读这个 Adob​​e Illustrator。我在第 origPage.CopyAsFormXObject(aiDocument); 行得到关于间接宾语的 PdfException。我不确定为什么会收到此错误,因为它是一个不同的文件。

iText.Kernel.Exceptions.PdfException: 'Cannot copy indirect object from the document that is being written.'

const float imageX = 111.318f, imageY = 130.791f;
//const float imageWidth = 755.454f, imageHeight = 432.094f;
    
string aifilePath = @"PathToAIFile.ai";    
var buffer = File.ReadAllBytes(aifilePath);
using (var aiStream = new MemoryStream(buffer))
using (var aimodifiedaiStream = new MemoryStream())
{
   var aiReader = new iText.Kernel.Pdf.PdfReader(aiStream);
   var aiDocument = new PdfDocument(aiReader, new PdfWriter(aimodifiedaiStream));
   PdfPage origPage = aiDocument.GetFirstPage();
   PdfFormXObject  aifForm = origPage.CopyAsFormXObject(aiDocument);
   canvasPage.AddXObjectAt(aifForm, imageX, imageY);
}

更新了两个 PdfDocument

const float imageX = 111.318f, imageY = 130.791f;
//const float imageWidth = 755.454f, imageHeight = 432.094f;

string aifilePath = @"PathToAIFile.ai";    
var buffer = File.ReadAllBytes(aifilePath);
using (var aiStream = new MemoryStream(buffer))
using (var aimodifiedaiStream = new MemoryStream())
{
   var aisourceReader = new iText.Kernel.Pdf.PdfReader(aiStream);
   var pdfsourceDocument = new PdfDocument(aisourceReader, new PdfWriter(aimodifiedaiStream));
   var pdftargetDocument = new PdfDocument(aisourceReader);
   PdfPage origPage = aiDocument.GetFirstPage();
   PdfFormXObject  aifForm = origPage.CopyAsFormXObject(aiDocument);
   canvasPage.AddXObjectAt(aifForm, imageX, imageY);
}

更新了 pdftargetDocument 有一个作者和 pdfsourceDocument 只有 PdfReader 仍然收到错误 Cannot copy to document opened in reading mode.'

using (var aiStream = new MemoryStream(buffer))
using (var aimodifiedaiStream = new MemoryStream())
   {
   var aisourceReader = new iText.Kernel.Pdf.PdfReader(new MemoryStream(buffer));
   var aitargetReader = new iText.Kernel.Pdf.PdfReader(new MemoryStream(buffer));
                
   var pdfsourceDocument = new PdfDocument(aisourceReader);
   var pdftargetDocument = new PdfDocument(aitargetReader, new PdfWriter(aimodifiedaiStream));
   PdfPage origPage = pdfsourceDocument.GetFirstPage();

   PdfFormXObject  aifForm = origPage.CopyAsFormXObject(pdfsourceDocument);
   canvasPage.AddXObjectAt(aifForm, imageX, imageY);
   pdfsourceDocument.Close();
   pdftargetDocument.Close();
   }

总结我的评论作为答案...

您将页面从 PdfDocument aiDocument 作为 XObject 形式复制到相同的 aiDocument

显然正在编写 aiDocument,它的构造函数中有一个 PdfWriter。但是 iText API 只允许从没有 PdfWriter.

构造的 PdfDocument 复制页面

此外,您只能复制到写入的PdfDocument,即用PdfWriter构造的PdfDocument。因此,您无法从文档复制到自身。

因此,您需要不同的 PdfDocument 个实例作为复制过程的源和目标。

生成的源 PdfDocument 实例只有一个 PdfReader,没有 PdfWriter。目标 PdfDocument 实例是用 PdfWriter 生成的。如果目标也使用 PdfReader 生成取决于您的具体用例:您是要将 XObject 添加到现有文档中,还是要将其添加到没有任何先前内容的空文档中。