android - 使用 itext 库加密 pdf

标签 android encryption pdf-generation itext

在我成功生成带水印的 pdf 之前,我正在尝试加密 pdf,但是在加水印时,当我加密 pdf 时,它会出现错误:

11-08 09:03:13.579: W/System.err(29720): java.lang.IllegalArgumentException: No valid encryption mode
11-08 09:03:13.579: W/System.err(29720):    at com.itextpdf.text.pdf.PdfEncryption.setCryptoMode(PdfEncryption.java:198)
11-08 09:03:13.579: W/System.err(29720):    at com.itextpdf.text.pdf.PdfWriter.setEncryption(PdfWriter.java:2042)
11-08 09:03:13.579: W/System.err(29720):    at com.itextpdf.text.pdf.PdfStamper.setEncryption(PdfStamper.java:293)
11-08 09:03:13.579: W/System.err(29720):    at com.example.demo_pdfgenerate.WaterMarkAndPdfGenerate.WaterMarkEffect(WaterMarkAndPdfGenerate.java:135)
11-08 09:03:13.588: W/System.err(29720):    at com.example.demo_pdfgenerate.WaterMarkAndPdfGenerate.onCreate(WaterMarkAndPdfGenerate.java:81)
11-08 09:03:13.588: W/System.err(29720):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-08 09:03:13.588: W/System.err(29720):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-08 09:03:13.588: W/System.err(29720):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-08 09:03:13.588: W/System.err(29720):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-08 09:03:13.588: W/System.err(29720):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-08 09:03:13.588: W/System.err(29720):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 09:03:13.588: W/System.err(29720):    at android.os.Looper.loop(Looper.java:123)
11-08 09:03:13.588: W/System.err(29720):    at android.app.ActivityThread.main(ActivityThread.java:4627)
11-08 09:03:13.588: W/System.err(29720):    at java.lang.reflect.Method.invokeNative(Native Method)
11-08 09:03:13.588: W/System.err(29720):    at java.lang.reflect.Method.invoke(Method.java:521)
11-08 09:03:13.599: W/System.err(29720):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-08 09:03:13.599: W/System.err(29720):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-08 09:03:13.599: W/System.err(29720):    at dalvik.system.NativeStart.main(Native Method)

如果我在加水印之前加密它工作正常但在加水印时它再次给出错误 first decry-pt your pdf

那么最好的加密方式是什么,如果我做对了,那我就不足了。

代码@

pdf 生成#

        try {
        document = new Document();

        PdfWriter.getInstance(document, new FileOutputStream(FILE));
        document.open();
        addImage();
        addTitlePage(document);
        createTable();
        document.close();
       //watermarking...
       WaterMarkEffect();

水印#

内部水印我在做加密。

    public void WaterMarkEffect() {
    try {
        reader = new PdfReader(FILE);
        n = reader.getNumberOfPages();

        // Create a stamper that will copy the document to a new file
        stamp = new PdfStamper(reader, new FileOutputStream(Des));

               //pdf encryption
        stamp.setEncryption(OWNER_PASS.getBytes(),
                USER_PASS.getBytes(), PdfWriter.ENCRYPTION_AES_256| PdfWriter.DO_NOT_ENCRYPT_METADATA, PdfWriter.ALLOW_PRINTING);


        // img = Image.getInstance("watermark.jpg");
        Drawable myImage = getResources().getDrawable(
                R.drawable.back_watermarker_dull_small);
        Bitmap bitmap = ((BitmapDrawable) myImage).getBitmap();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] bitmapdata = stream.toByteArray();
        img = Image.getInstance(bitmapdata);

        bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI,
                BaseFont.EMBEDDED);
        img.setAbsolutePosition(150, 0);
        // img.scalePercent(SCALE_PER);

        // while (i < n) {
        // Watermark under the existing page
        under = stamp.getUnderContent(i);
        under.addImage(img);

        // Text over the existing page
        over = stamp.getOverContent(i);
        over.beginText();
        over.setFontAndSize(bf, 18);
        over.showText("page " + i);
        over.endText();

        // i++;
        // }


        stamp.close();
    } catch (DocumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

您的建议很重要。

最佳答案

替换你的加密代码@

使用#

        stamp.setEncryption(USER_PASS.getBytes(), OWNER_PASS.getBytes(),
                PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128
                        | PdfWriter.DO_NOT_ENCRYPT_METADATA);

代替#

stamp.setEncryption(OWNER_PASS.getBytes(),
                USER_PASS.getBytes(), PdfWriter.ENCRYPTION_AES_256| PdfWriter.DO_NOT_ENCRYPT_METADATA, PdfWriter.ALLOW_PRINTING);

关于android - 使用 itext 库加密 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13284160/

相关文章:

android - 如何在 GridView 中从数据库中一张一张地加载图像?

android - Android 手机上的 canvas.toDataURL 和 drawimage 问题

c - 异或加密失败

pdf-generation - 如何选择纸盒

Android获取日期差异

java - 反序列化其中包含多个项目的 JSON 对象

java - 使用java进行RSA解密失败

encryption - RSA 加密输出大小

javascript - mozilla pdf.js 没有全 View

razor - 如何使用 media=print 的样式从 View 生成 PDF