有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    @Alberto问题的答案:如果只有字节数组作为输入,并且需要另一个字节数组作为输出,那么如何加密pdf,使用前面的答案

    我有一个名为addPassword(byte[]templateByte)的方法,它接受PDF文件的字节数组作为参数,并返回加密的字节数组作为响应

    public byte[] addPassword(byte[] templateByte)
        {
    
            String USER_PASS = "Hello123";
            String OWNER_PASS = "Deva123";
            PdfReader pdfReader = null;
    
            ByteArrayOutputStream byteArrayOutputStream = ByteArrayOutputStream(templateByte.length);
    
    //removed manual write to output stream
    
            try
            {
    
                pdfReader = new PdfReader(templateByte);
                PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);
                stamper.setEncryption(USER_PASS.getBytes(), OWNER_PASS.getBytes(),
                        PdfWriter.ALLOW_PRINTING,
                        PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
                stamper.close();
                pdfReader.close();
    
                return byteArrayOutputStream.toByteArray();
    
            }
            catch (Exception e)
            {
    
                e.printStackTrace();
            }
    
            return byteArrayOutputStream.toByteArray();
        }
    
  2. # 2 楼答案

    你看过我书第12章的例子了吗

    就这么简单:

    public void encryptPdf(String src, String dest) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        stamper.setEncryption(USER, OWNER,
            PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
        stamper.close();
        reader.close();
    }
    

    请注意USEROWNER属于byte[]类型。您有不同的权限选项(查找以ALLOW_开头的常量),并且可以从不同的加密算法中进行选择

    至于参数:src是现有PDF的路径dest是加密PDF的路径。很明显,在读取文件时不能写入文件。这里解释道:How to update a PDF without creating a new PDF?