我已经编写了一个pdf生成代码,它工作正常,但现在我以安全模式生成一个pdf文件。
这是我的安全模式代码
try {
HttpServletResponse response = ServletActionContext.getResponse();
PDFGenerator pdf = new PDFGenerator();
PDFGenerator generator=new PDFGenerator();
/* byte[] bytes = null;
bytes = (generator.generatepdf(sosValues.getCmaId(), null)).toByteArray();
//bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
if (bytes != null) {
bis = new ByteArrayInputStream(bytes);
}*/
ByteArrayOutputStream baos=generator.generatepdf(sosValues.getCmaId(), null);
bis = new ByteArrayInputStream(baos.toByteArray());
PdfReader pdfReader=new PdfReader(bis);
PdfStamper pdfStamper=new PdfStamper(pdfReader, baos);
pdfStamper.setEncryption(null,null, PdfWriter.HideToolbar, PdfWriter.STRENGTH40BITS);
pdfStamper.setEncryption("Hello".getBytes(), "World".getBytes(), PdfWriter.AllowPrinting
| PdfWriter.AllowCopy, PdfWriter.STRENGTH40BITS);
pdfStamper.close();
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
调试时,我在此行pdfStamper.setEncryption(null,null, PdfWriter.HideToolbar, PdfWriter.STRENGTH40BITS);
浏览器中的异常是:
服务器遇到内部错误,导致无法完成此请求。
答案 0 :(得分:0)
PdfWriter.HideToolbar
是查看者偏好,而不是权限。
这是权限列表:
此外:隐藏工具栏以希望保护 PDF是错误的。请阅读我对How to disable download option of pdf file in c# ?
的回答即使使用加密来避免打印也许不是最好的想法。见How to protect a PDF with a username and password?
然而,这并不是导致您出现问题的原因。内部错误是由您使用ByteArrayOutputStream
的奇怪方式引起的。您可以使用generatepdf()
方法在内存中生成PDF。你没有分享这种方法,但是:
stamper
对象向其添加新字节。您无法向已关闭的OutputStream
添加额外字节。PdfReader
尝试阅读(未完成的)PDF时,您将收到例外。此外,您首先要创建PDF,然后阅读该PDF以对其进行加密,这一点非常奇怪。为什么不马上加密?这可以节省你的CPU时间。