yuankai 发表于 2013-2-5 02:44:56

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

最近的项目中使用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);      }}
页: [1]
查看完整版本: Itext生成PDF文件加密与加水印