使用iTextSharp将大型隐藏文本/字符串存储到PDF

时间:2014-03-24 06:10:33

标签: string pdf out-of-memory itextsharp

我想在隐藏的某处隐藏PDF文档中存储一个大字符串。现在我有一个隐藏的文本字段,我正在写这个文本。问题是当字符串大小增加到 10MB 时,我开始收到OutOfMemory错误。

使用iTextSharp将一些大型隐藏字符串/文本存储到PDF文档的最佳方法是什么?该文本/字符串也应该在以后检索。

1 个答案:

答案 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#应该很容易):

存储文档 PieceInfo 数据

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();

检索文档 PieceInfo 数据

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)