Java 在安全模式下生成pdf文件

Java 在安全模式下生成pdf文件,java,hibernate,struts2,pdf-generation,itext,Java,Hibernate,Struts2,Pdf Generation,Itext,我已经写了一个生成pdf的代码,它工作得很好,但现在我需要在安全模式下生成pdf文件 这是我的安全模式代码 try { HttpServletResponse response = ServletActionContext.getResponse(); PDFGenerator pdf = new PDFGenerator(); PDFGenerator generator=new PDFGenerator(); /*

我已经写了一个生成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.strength40位)遇到异常

浏览器中的异常为:

服务器遇到内部错误,无法满足此请求


PdfWriter.HideToolbar
是查看器首选项,而不是权限

这是权限列表:

  • PdfWriter.ALLOW_打印
  • PdfWriter.ALLOW_MODIFY_内容
  • PdfWriter.ALLOW_COPY
  • PdfWriter.ALLOW_MODIFY_注释
  • PdfWriter.ALLOW_FILL_
  • PdfWriter.ALLOW_SCREEN_阅读器
  • PdfWriter.ALLOW_程序集
  • PdfWriter.ALLOW_降级_打印
此外:为了保护PDF而隐藏工具栏是错误的。请阅读我对你的回答

即使使用加密来避免打印也可能不是最好的主意。看

然而,这并不是问题的根源。内部错误是由您使用
ByteArrayOutputStream
的奇怪方式引起的。您可以使用
generatepdf()
方法在内存中生成PDF。您没有共享该方法,但是:

  • 如果要关闭该流,则会出现异常,因为您试图使用
    stamper
    对象向其添加新字节。无法向关闭的
    输出流添加额外字节
  • 如果您不关闭该流,则您的PDF文件不完整,并且当
    PdfReader
    尝试读取(未完成的)PDF文件时,您会遇到异常

此外,非常奇怪的是,您首先创建PDF,然后读取该PDF对其进行加密。为什么不马上加密呢?这节省了您的CPU时间。

您至少应该通过查看服务器日志而不是浏览器来说明您正在使用什么来创建PDF(看起来是iText),标记它,并添加基本错误,而不是那些高级别的废话。