【问题标题】:Generate pdf file in Secured mode在安全模式下生成 pdf 文件
【发布时间】:2014-05-05 07:03:54
【问题描述】:

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

浏览器中的异常是:

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

【问题讨论】:

  • 您至少应该通过查看服务器日志而不是查看服务器日志来说明您用于创建 PDF(iText,显然是)、标记它并添加底层错误,而不是那么高级的废话在浏览器中。

标签: java hibernate struts2 pdf-generation itext


【解决方案1】:

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 时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多