六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1160|回复: 0

Itext生成PDF文件加密与加水印

[复制链接]

升级  2.67%

12

主题

12

主题

12

主题

秀才

Rank: 2

积分
54
 楼主| 发表于 2013-2-5 02:44:56 | 显示全部楼层 |阅读模式
最近的项目中使用Itext将txt文件转换为PDF文件,并且实现对文件的一些权限控制。现实对pdf文件加密,添加水印等。最主要的是要实现对pdf文件实现密钥签名,一直都还没有实现成功!等实现好了后再加上来。
public class PdfConvertor {    //txt原始文件的路径    private static final String txtFilePath = "d:/Itext/test.txt";    //生成的pdf文件路径    private static final String pdfFilePath = "d:/Itext/test.pdf";    //添加水印图片路径    private static final String imageFilePath = "D:/image/b.gif";    //生成临时文件前缀    private static final String prefix = "tempFile";    //所有者密码    private static final String OWNERPASSWORD = "12345678";    /**     * txt文件转换为pdf文件     *      * @param txtFile     *            txt文件路径     * @param pdfFile     *            pdf文件路径     * @param userPassWord     *            用户密码     * @param waterMarkName     *            水印内容     * @param permission     *            操作权限     */    public static void generatePDFWithTxt(String txtFile, String pdfFile,            String userPassWord, String waterMarkName, int permission) {        try {            // 生成临时文件            File file = File.createTempFile(prefix, ".pdf");            // 创建pdf文件到临时文件            if (createPDFFile(txtFile, file)) {                // 增加水印和加密                waterMark(file.getPath(), pdfFile, userPassWord, OWNERPASSWORD,                        waterMarkName, permission);            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 创建PDF文档     *      * @param txtFilePath     *            txt文件路径(源文件)     * @param pdfFilePath     *            pdf文件路径(新文件)     */    private static boolean createPDFFile(String txtFilePath, File file) {        // 设置纸张        Rectangle rect = new Rectangle(PageSize.A4);        // 设置页码        HeaderFooter footer = new HeaderFooter(new Phrase("页码:", PdfConvertor                .setChineseFont()), true);        footer.setBorder(Rectangle.NO_BORDER);        // step1        Document doc = new Document(rect, 50, 50, 50, 50);        doc.setFooter(footer);        try {            FileReader fileRead = new FileReader(txtFilePath);            BufferedReader read = new BufferedReader(fileRead);            // 设置pdf文件生成路径 step2            PdfWriter.getInstance(doc, new FileOutputStream(file));            // 打开pdf文件 step3            doc.open();            // 实例化Paragraph 获取写入pdf文件的内容,调用支持中文的方法. step4            while (read.ready()) {                // 添加内容到pdf(这里将会按照txt文件的原始样式输出)                doc.add(new Paragraph(read.readLine(), PdfConvertor                        .setChineseFont()));            }            // 关闭pdf文件 step5            doc.close();            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 在pdf文件中添加水印     *      * @param inputFile     *            原始文件     * @param outputFile     *            水印输出文件     * @param waterMarkName     *            水印名字     */    private static void waterMark(String inputFile, String outputFile,            String userPassWord, String ownerPassWord, String waterMarkName,            int permission) {        try {            PdfReader reader = new PdfReader(inputFile);            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(                    outputFile));            // 设置密码               stamper.setEncryption(userPassWord.getBytes(), ownerPassWord                    .getBytes(), permission, false);            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",                    BaseFont.NOT_EMBEDDED);            int total = reader.getNumberOfPages() + 1;            Image image = Image.getInstance(imageFilePath);            image.setAbsolutePosition(200, 400);            PdfContentByte under;            int j = waterMarkName.length();            char c = 0;            int rise = 0;            for (int i = 1; i < total; i++) {                rise = 500;                under = stamper.getUnderContent(i);                // 添加图片                // under.addImage(image);                under.beginText();                under.setColorFill(Color.CYAN);                under.setFontAndSize(base, 30);                // 设置水印文字字体倾斜 开始                if (j >= 15) {                    under.setTextMatrix(200, 120);                    for (int k = 0; k < j; k++) {                        under.setTextRise(rise);                        c = waterMarkName.charAt(k);                        under.showText(c + "");                        rise -= 20;                    }                } else {                    under.setTextMatrix(180, 100);                    for (int k = 0; k < j; k++) {                        under.setTextRise(rise);                        c = waterMarkName.charAt(k);                        under.showText(c + "");                        rise -= 18;                    }                }                // 字体设置结束                under.endText();                // 画一个圆                // under.ellipse(250, 450, 350, 550);                // under.setLineWidth(1f);                // under.stroke();            }            stamper.close();        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 设置中文     *      * @return Font     */    private static Font setChineseFont() {        BaseFont base = null;        Font fontChinese = null;        try {            base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",                    BaseFont.EMBEDDED);            fontChinese = new Font(base, 12, Font.NORMAL);        } catch (DocumentException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return fontChinese;    }        public static void main(String[] args) {        generatePDFWithTxt(txtFilePath,    pdfFilePath, "123", "www.emice.com", 16);        }}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表