我想在隐藏的某处隐藏PDF文档中存储一个大字符串。现在我有一个隐藏的文本字段,我正在写这个文本。问题是当字符串大小增加到 10MB 时,我开始收到OutOfMemory
错误。
使用iTextSharp
将一些大型隐藏字符串/文本存储到PDF文档的最佳方法是什么?该文本/字符串也应该在以后检索。
答案 0 :(得分:4)
此类私人数据可以存储在 PieceInfo 词典中,也可以参考。 David's answer to the OP's follow-up question
This answer to the older question "Insert hidden digest in pdf using iText library"显示如何使用iText / Java一般使用 PieceInfo 词典(与iTextSharp / C#的差异在这里应该是最小的。)
由于OP谈论10 MB及以上的数据,他可能想要使用PDF流而不是字符串。
旧答案中提供的DocumentPieceInfo
助手类可以像这样用于大数据的PDF流(再次在Java中,因为我主要生活在Java端,并且再次移植到C#应该很容易):
PdfName appName = new PdfName("MYAPP");
PdfName dataName = new PdfName("BigData");
DocumentPieceInfo dpi = new DocumentPieceInfo();
PdfReader reader = new PdfReader(...);
PdfStamper stamper = new PdfStamper(reader, ...);
InputStream in = ... BIG DATA INPUT STREAM ...;
PdfStream stream = new PdfStream(in, stamper.getWriter());
stream.flateCompress();
PdfIndirectObject ref = stamper.getWriter().addToBody(stream);
stream.writeLength();
in.close();
dpi.addPieceInfo(reader, appName, dataName, ref.getIndirectReference());
stamper.close();
PdfName appName = new PdfName("MYAPP");
PdfName dataName = new PdfName("BigData");
DocumentPieceInfo dpi = new DocumentPieceInfo();
PdfReader reader = new PdfReader("target/test-outputs/test-with-piece-info.pdf");
PdfObject myDataObject = dpi.getPieceInfo(reader, appName, dataName);
myDataObject = PdfReader.getPdfObject(myDataObject);
byte[] myData = PdfReader.getStreamBytes((PRStream)myDataObject)