繁体   English   中英

如何使用ITextSharp保存PDF?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM