- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 ITextSharp 将多页 PDF 文件拆分为单页文件。我还设法使用 MemoryStream 将这些单页 PDF 添加到 zip 文件中。
现在,我需要使用 PdfStamper 为这些 PDF 添加密码保护,然后再将它们添加到 zip 文件中。但是每当我尝试这样做时,都会抛出 ObjectDisposedException - Cannot access a closed Stream.
。
Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile();
int cnt = 0;
try
{
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdfPath), new ASCIIEncoding().GetBytes(""));
for (cnt = 1; cnt <= reader.NumberOfPages; cnt++)
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (iTextSharp.text.Document document = new iTextSharp.text.Document())
{
iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, memoryStream);
using (PdfStamper stamper = new PdfStamper(reader, memoryStream))
{
stamper.SetEncryption(
null,
Encoding.ASCII.GetBytes("password_here"),
PdfWriter.ALLOW_PRINTING,
PdfWriter.ENCRYPTION_AES_128);
}
memoryStreamForZipFile = new MemoryStream(memoryStream.ToArray());
memoryStreamForZipFile.Seek(0, SeekOrigin.Begin);
}
}
}
zipFile.Save(destinationFolder + "/" + fileName.Replace(".pdf", ".zip"));
reader.Close();
reader.Dispose();
}
catch
{
}
finally
{
GC.Collect();
}
return cnt - 1;
为了清楚起见,我删除了上面的一些代码。
如果我删除 PdfStamper“using” block ,代码就可以正常工作。我还尝试调整 PdfStamper 的位置,看看我是否在错误的地方使用了它。
我没有正确使用 using
block 吗?或者我必须在此处修复一些代码序列?
最佳答案
你删除了一些必要的行是错误的;例如:我假设您要将 PdfImportedPage
添加到 PdfWriter
的 PdfContentByte
中。如果是这样,您将忽略官方文档中给出的所有警告。
你应该用这样的东西替换你的代码:
PdfReader reader = new PdfReader(pathToFile);
int n = reader.NumberOfPages;
int cnt;
for (cnt = 1; cnt <= reader.NumberOfPages; cnt++)
{
reader = new PdfReader(pathToFile);
reader.SelectPages(cnt.ToString());
MemoryStream memoryStream = new MemoryStream();
using (PdfStamper stamper = new PdfStamper(reader, memoryStream))
{
stamper.SetEncryption(
null,
Encoding.ASCII.GetBytes("password_here"),
PdfWriter.ALLOW_PRINTING,
PdfWriter.ENCRYPTION_AES_128);
}
reader.Close();
// now do something with the memoryStream.ToArray()
}
如您所见,无需引入Document
或PdfWriter
对象。如果您使用这些类,您将丢弃原始页面中存在的所有交互性。如果原始页面的页面大小与 A4 不同,您也会遇到麻烦。
请注意,您不能在使用 PdfStamper
时重用 PdfReader
实例。一旦将 PdfReader
实例传递给 PdfStamper
,该实例就会被篡改。
关于c# - ITextSharp - 使用 PdfStamper 产生的 MemoryStream 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32048421/
我正在尝试对 StockData 表执行 OHCL sql 查询 (SQL Server 2012)。每天有数千行添加到表中,我想获取每天的开盘价、最高价、最低价和收盘价数据。 建表sql如下:
我是一名优秀的程序员,十分优秀!