在安全模式下生成pdf文件

时间:2014-05-05 07:03:55

标签: java hibernate struts2 pdf-generation itext

我已经编写了一个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);

收到异常

浏览器中的异常是:

  

服务器遇到内部错误,导致无法完成此请求。

1 个答案:

答案 0 :(得分:0)

PdfWriter.HideToolbar查看者偏好,而不是权限

这是权限列表:

  • PdfWriter.ALLOW_PRINTING
  • PdfWriter.ALLOW_MODIFY_CONTENTS
  • PdfWriter.ALLOW_COPY
  • PdfWriter.ALLOW_MODIFY_ANNOTATIONS
  • PdfWriter.ALLOW_FILL_IN
  • PdfWriter.ALLOW_SCREEN_READERS
  • PdfWriter.ALLOW_ASSEMBLY
  • PdfWriter.ALLOW_DEGRADED_PRINTING

此外:隐藏工具栏以希望保护 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添加额外字节。
  • 如果您没有关闭该流,则您的PDF无法完成,并且当PdfReader尝试阅读(未完成的)PDF时,您将收到例外。

此外,您首先要创建PDF,然后阅读该PDF以对其进行加密,这一点非常奇怪。为什么不马上加密?这可以节省你的CPU时间。