我使用ITextSharp处理PDF注释。我能够非常顺利地添加注释。但现在我正在尝试编辑它们。看起来我的PdfReader对象实际上已经更新了。但由于某种原因,我无法保存它。如下面的代码片段所示,我尝试使用stamper获取字节数组。不管注释有多长,字节数组只比以前的版本长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实例化中的最后两个参数。我以前只使用了两个参数就尝试过它,结果文件被破坏了。然后我再试了一次,现在它工作了……这是片段
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();
}
}
}
PdfStamper
在关闭时执行大部分写入操作。这隐含地发生在使用块的末尾。但是您检索该块中已经存在的
MemoryStream
内容。因此,PDF尚未写入检索到的byte[]
。
而是在检索
byte[]
之前显式关闭PdfStamper
instance:
using (PdfStamper stamp = new PdfStamper(pdfReader, outStream, '\0', true))
{
stamp.Close();
newBuffer = outStream.ToArray();
}
或者在< code>using
块之后检索< code>byte[]:
using (PdfStamper stamp = new PdfStamper(pdfReader, outStream, '\0', true))
{
}
newBuffer = outStream.ToArray();
问题内容: 我使用以下代码将汉字保存到.txt文件中,但是当我用写字板打开它时,我看不懂它。 我能做什么 ?我知道如果将汉字剪切并粘贴到写字板中,可以将其保存到.txt文件中。如何在Java中做到这一点? 问题答案: 这里有几个因素在起作用: 文本文件没有用于描述其编码的内在元数据(就尖括号税而言,XML受欢迎是有原因的) Windows的默认编码仍然是8位(或双字节)“ ANSI ”字符集,其值
给定此方法: 忽略变量名,该方法所做的是将加密代码的数据写入名为EncryptedMessage的项目文件夹内生成的txt文件中。txt。 我需要的是一种方法来保存txt文件,而不是在项目文件夹中,保存在用户在运行期间指定的位置(打开另存为对话框)。我认为这可以由JFilechooser完成,但我无法让它工作。
问题内容: 在Java中,我来自一个名为“ text”的String变量中的文本字段中的文本。 如何将“文本”变量的内容保存到文件中? 问题答案: 如果你只是输出文本,而不是任何二进制数据,则可以执行以下操作: 然后,将String写入其中,就像写入任何输出流一样: 与以往一样,你将需要异常处理。完成写作后,请务必致电。 如果你使用的是Java 7或更高版本,则可以使用“ 语句 ”,该语句将Pri
我有一个powershell脚本,我用这种方式保存日志 在Python中如何使用它?
我是Java的初学者。我正在使用netbeans 7.3 IDE的GUI编辑器制作一个简单的文本编辑器。我面临的主要问题是无法保存/打开文件。我已经创建了“保存”按钮。当我删除文件选择器时,它是一个嵌入在java窗口中的正常打开的文件对话框,没有任何功能。我还尝试在单击save按钮(在源代码视图中)时创建一个新的jFileChooser,但它不起作用 简而言之,我需要一个简单的打开/保存对话框。当
问题内容: 我正在尝试对代码进行编程,以便如果用户按下“夜间按钮”,则背景将变为黑色,并且如果用户关闭应用程序,则背景将保持黑色。(白天模式也是如此。) 请注意:我已经对按钮进行了编码,当他们按下按钮时,所有场景都会切换到该模式。 这是我的代码,需要保存背景色:(两个if语句都需要它) 我的日夜颜色: 问题答案: Swift 4.2或更高版本 请注意,这只会将RGBA CGFloat值另存为属性列