[英]How to save PDF using ITextSharp?
我使用ITextSharp处理PDF注释。 我能够非常顺利地添加注释。 但是现在我正在尝试编辑它们。 看来我的PdfReader对象实际上已更新。 但是由于某种原因,我无法保存它。 如下面的代码片段所示,我尝试通过使用压模获得字节数组。 无论注释有多长,字节数组都仅比以前的版本长1个字节。 当我打开保存在文件系统上的PDF时,我仍然拥有旧的注释...
private void UpdatePDFAnnotation(string title, string body)
{
byte[] newBuffer;
using (PdfReader pdfReader = new PdfReader(dataBuffer))
{
int pageIndex = 1;
int annotIndex = 0;
PdfDictionary pageDict = pdfReader.GetPageN(pageIndex);
var annots = pageDict.GetAsArray(PdfName.ANNOTS);
if (annots != null)
{
PdfDictionary annot = annots.GetAsDict(annotIndex);
annot.Put(PdfName.T, new PdfString(title));
annot.Put(PdfName.CONTENTS, new PdfString(body));
}
// ********************************
// this line shows the new annotation is in here. Just have to save it somehow !!
var updatedBody = pdfReader.GetPageN(pageIndex).GetAsArray(PdfName.ANNOTS).GetAsDict(0).GetAsString(PdfName.CONTENTS);
Debug.Assert(newBody == updatedBody.ToString(), "Annotation body should be equal");
using (MemoryStream outStream = new MemoryStream())
{
using (PdfStamper stamp = new PdfStamper(pdfReader, outStream, '\0', true))
{
newBuffer = outStream.ToArray();
}
}
}
File.WriteAllBytes( @"Assets\Documents\AnnotedPdf.pdf", newBuffer);
}
知道我的代码有什么问题吗?
PdfStamper
在关闭时会做很多工作。 这隐式发生在其using
块的末尾。 但是您可以检索该块中已经存在的MemoryStream
内容。 因此,PDF尚未写入检索到的byte[]
。
而是在检索byte[]
之前显式关闭PdfStamper
实例:
using (PdfStamper stamp = new PdfStamper(pdfReader, outStream, '\0', true))
{
stamp.Close();
newBuffer = outStream.ToArray();
}
或在 using
block 之后检索byte[]
:
using (PdfStamper stamp = new PdfStamper(pdfReader, outStream, '\0', true))
{
}
newBuffer = outStream.ToArray();
好吧,我终于让它工作了。 诀窍是PdfStamper实例中的最后两个参数。 我之前仅用2个参数进行了尝试,最终导致文件损坏。 然后我再次尝试,现在可以正常工作了……这是代码段
private void UpdatePDFAnnotation(string title, string body)
{
using (PdfReader pdfReader = new PdfReader(dataBuffer))
{
PdfDictionary pageDict = pdfReader.GetPageN(pageIndex);
var annots = pageDict.GetAsArray(PdfName.ANNOTS);
PdfDictionary annot = annots.GetAsDict(annotIndex);
annot.Put(PdfName.T, new PdfString(title));
annot.Put(PdfName.CONTENTS, new PdfString(body));
using (MemoryStream ms = new MemoryStream())
{
PdfStamper stamp = new PdfStamper(pdfReader, ms);
stamp.Dispose();
dataBuffer = ms.ToArray();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.