iText CopyAsFormXObject PdfException
iText CopyAsFormXObject PdfException
当我处理我的主要 pdf 文件时,当我到达第 2 页时,我开始阅读这个 Adobe 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 添加到现有文档中,还是要将其添加到没有任何先前内容的空文档中。
当我处理我的主要 pdf 文件时,当我到达第 2 页时,我开始阅读这个 Adobe 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 添加到现有文档中,还是要将其添加到没有任何先前内容的空文档中。