从base64字符串或字节数组生成受密码保护的PDF,并作为附件发送到电子邮件


  • 使用通过 jasper 报告生成的 base64 字符串生成 pdf,我也可以在 jrxml 中保护密码,但我有不同的要求,所以我不能保留在那里。 我想在仅发送附件时制作受保护的pdf,所以我尝试了许多可能性,例如(pdf作家,流媒体和所有(,但没有任何效果。 在我用来生成pdf作为附件的代码下面,我想使该附件受密码保护。

    MimeMessage message = mailSenderImpl.createMimeMessage();
    MimeMessageHelper helper;
    helper = new MimeMessageHelper(message, true);
    helper.setFrom(CacheUtils.getConfig(ApplicationConstant.
    DEFAULT_FROM_EMAIL));
    helper.setTo(request.getToEmail());
    helper.setSubject(request.getSendSubject());
    helper.setText("", request.getSendMessage());
    String sendAttachment = request.getSendAttachment();
    JSONObject jsonRec = new JSONObject(sendAttachment);
    JSONArray jArray = jsonRec.getJSONArray("Attachment");
    DataSource dataSource;
    String sAttachName;
    String sAttachBase64;
    JSONObject jsonRec = new JSONObject(sendAttachment);
    JSONArray jArray = jsonRec.getJSONArray("Attachment");
    DataSource dataSource;
    String sAttachName;
    String sAttachBase64;
    
    sAttachName = jArray.getJSONObject(i).has("AttachName") ?jArray.getJSONObject(i).getString("AttachName") : null;
    sAttachBase64 = jArray.getJSONObject(i).has("AttachBase64") ? jArray.getJSONObject(i).getString("AttachBase64") : null;
    dataSource = sAttachBase64 !=null ? new  
    ByteArrayDataSource(Base64.getDecoder().decode(sAttachBase64.getBytes()), "application/pdf") : null;
    helper.addAttachment(sAttachName, dataSource);
    

java 中的 pdf 编写器类能够制作加密的 pdf 文件。你可以用它创建。PDF编写器类提供用户名,密码加密以及加密类型,权限等...您可以在那里找到更多详细信息: PDF 作家类

byteStream = Base64.getDecoder().decode(sAttachBase64);
inputStream = new ByteArrayInputStream(byteStream); 
byte[] buffer = new byte[1024];
baos = new ByteArrayOutputStream();
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
reader = new PdfReader(byteStream);
stamper = new PdfStamper(reader, baos);
stamper.setEncryption("test".getBytes(), "test".getBytes(),PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
stamper.close();
dataSource = new ByteArrayDataSource(baos.toByteArray(), "application/pdf");

最新更新