新闻资讯 | 控件产品 | 技术文章 | 购物车 | 合作伙伴 | 问题解答 | 电子简报 | PDF论坛 | 资源下载
您现在的位置:技术文章>PDF开发篇 首页|PDF应用篇|PDF开发篇|解决方案

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

发布日期:2012-7-12 作者:sjzs5590 出处:csdn

原文地址:http://blog.csdn.net/sjzs5590/article/details/7735149

  1. public class PdfConvertor {
  2. //txt原始文件的路径
  3. private static final String txtFilePath = "d:/Itext/test.txt";
  4. //生成的pdf文件路径
  5. private static final String pdfFilePath = "d:/Itext/test.pdf";
  6. //添加水印图片路径
  7. private static final String imageFilePath = "D:/image/b.gif";
  8. //生成临时文件前缀
  9. private static final String prefix = "tempFile";
  10. //所有者密码
  11. private static final String OWNERPASSWORD = "12345678";
  12. /**
  13. * txt文件转换为pdf文件
  14. *
  15. * @param txtFile
  16. * txt文件路径
  17. * @param pdfFile
  18. * pdf文件路径
  19. * @param userPassWord
  20. * 用户密码
  21. * @param waterMarkName
  22. * 水印内容
  23. * @param permission
  24. * 操作权限
  25. */
  26. public static void generatePDFWithTxt(String txtFile, String pdfFile,
  27. String userPassWord, String waterMarkName, int permission) {
  28. try {
  29. // 生成临时文件
  30. File file = File.createTempFile(prefix, ".pdf");
  31. // 创建pdf文件到临时文件
  32. if (createPDFFile(txtFile, file)) {
  33. // 增加水印和加密
  34. waterMark(file.getPath(), pdfFile, userPassWord, OWNERPASSWORD,
  35. waterMarkName, permission);
  36. }
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. /**
  42. * 创建PDF文档
  43. *
  44. * @param txtFilePath
  45. * txt文件路径(源文件)
  46. * @param pdfFilePath
  47. * pdf文件路径(新文件)
  48. */
  49. private static boolean createPDFFile(String txtFilePath, File file) {
  50. // 设置纸张
  51. Rectangle rect = new Rectangle(PageSize.A4);
  52. // 设置页码
  53. HeaderFooter footer = new HeaderFooter(new Phrase("页码:", PdfConvertor
  54. .setChineseFont()), true);
  55. footer.setBorder(Rectangle.NO_BORDER);
  56. // step1
  57. Document doc = new Document(rect, 50, 50, 50, 50);
  58. doc.setFooter(footer);
  59. try {
  60. FileReader fileRead = new FileReader(txtFilePath);
  61. BufferedReader read = new BufferedReader(fileRead);
  62. // 设置pdf文件生成路径 step2
  63. PdfWriter.getInstance(doc, new FileOutputStream(file));
  64. // 打开pdf文件 step3
  65. doc.open();
  66. // 实例化Paragraph 获取写入pdf文件的内容,调用支持中文的方法. step4
  67. while (read.ready()) {
  68. // 添加内容到pdf(这里将会按照txt文件的原始样式输出)
  69. doc.add(new Paragraph(read.readLine(), PdfConvertor
  70. .setChineseFont()));
  71. }
  72. // 关闭pdf文件 step5
  73. doc.close();
  74. return true;
  75. } catch (Exception e) {
  76. e.printStackTrace();
  77. return false;
  78. }
  79. }
  80. /**
  81. * 在pdf文件中添加水印
  82. *
  83. * @param inputFile
  84. * 原始文件
  85. * @param outputFile
  86. * 水印输出文件
  87. * @param waterMarkName
  88. * 水印名字
  89. */
  90. private static void waterMark(String inputFile, String outputFile,
  91. String userPassWord, String ownerPassWord, String waterMarkName,
  92. int permission) {
  93. try {
  94. PdfReader reader = new PdfReader(inputFile);
  95. PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
  96. outputFile));
  97. // 设置密码
  98. stamper.setEncryption(userPassWord.getBytes(), ownerPassWord
  99. .getBytes(), permission, false);
  100. BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
  101. BaseFont.NOT_EMBEDDED);
  102. int total = reader.getNumberOfPages() + 1;
  103. Image image = Image.getInstance(imageFilePath);
  104. image.setAbsolutePosition(200, 400);
  105. PdfContentByte under;
  106. int j = waterMarkName.length();
  107. char c = 0;
  108. int rise = 0;
  109. for (int i = 1; i < total; i++) {
  110. rise = 500;
  111. under = stamper.getUnderContent(i);
  112. // 添加图片
  113. // under.addImage(image);
  114. under.beginText();
  115. under.setColorFill(Color.CYAN);
  116. under.setFontAndSize(base, 30);
  117. // 设置水印文字字体倾斜 开始
  118. if (j >= 15) {
  119. under.setTextMatrix(200, 120);
  120. for (int k = 0; k < j; k++) {
  121. under.setTextRise(rise);
  122. c = waterMarkName.charAt(k);
  123. under.showText(c + "");
  124. rise -= 20;
  125. }
  126. } else {
  127. under.setTextMatrix(180, 100);
  128. for (int k = 0; k < j; k++) {
  129. under.setTextRise(rise);
  130. c = waterMarkName.charAt(k);
  131. under.showText(c + "");
  132. rise -= 18;
  133. }
  134. }
  135. // 字体设置结束
  136. under.endText();
  137. // 画一个圆
  138. // under.ellipse(250, 450, 350, 550);
  139. // under.setLineWidth(1f);
  140. // under.stroke();
  141. }
  142. stamper.close();
  143. } catch (Exception e) {
  144. e.printStackTrace();
  145. }
  146. }
  147. /**
  148. * 设置中文
  149. *
  150. * @return Font
  151. */
  152. private static Font setChineseFont() {
  153. BaseFont base = null;
  154. Font fontChinese = null;
  155. try {
  156. base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
  157. BaseFont.EMBEDDED);
  158. fontChinese = new Font(base, 12, Font.NORMAL);
  159. } catch (DocumentException e) {
  160. e.printStackTrace();
  161. } catch (IOException e) {
  162. e.printStackTrace();
  163. }
  164. return fontChinese;
  165. }
  166. public static void main(String[] args) {
  167. generatePDFWithTxt(txtFilePath, pdfFilePath, "123", "www.emice.com", 16);
  168. }
  169. }

bcprov-jdk15-139.jar 加密时用到。 iText-2.1.2u.jar Itext包。 iTextAsian.jar 在导入中文是要用到。


另:普通生成pdf代码

  1. package test;
  2. import java.awt.Color;
  3. import java.io.FileOutputStream;
  4. import com.lowagie.text.Cell;
  5. import com.lowagie.text.Chapter;
  6. import com.lowagie.text.Document;
  7. import com.lowagie.text.Font;
  8. import com.lowagie.text.FontFactory;
  9. import com.lowagie.text.List;
  10. import com.lowagie.text.ListItem;
  11. import com.lowagie.text.PageSize;
  12. import com.lowagie.text.Paragraph;
  13. import com.lowagie.text.Section;
  14. import com.lowagie.text.Table;
  15. import com.lowagie.text.pdf.PdfWriter;
  16. public class ITextTest {
  17. public static void main(String[] args) {
  18. try {
  19. /**
  20. * 实例化文档对象 第一个参数是页面大小。接下来的参数分别是左、右、上和下页边距。但是还没有定义该文档的类型。
  21. * 它取决于所创建的写入器的类型。对于我们的示例,选择了com.lowagie.text.pdf.PdfWriter。 其他写入器为
  22. * HtmlWriter、RtfWriter、XmlWriter 等等。它们的名称解释了它们的实际用途。
  23. */
  24. Document document = new Document(PageSize.A4, 50 , 50 , 50 , 50 );
  25. /**
  26. * 创建 PdfWriter 对象,第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。
  27. */
  28. PdfWriter writer = PdfWriter.getInstance(document,
  29. new FileOutputStream( " D:\\ITextTest.pdf " ));
  30. /**
  31. * 打开文档以写入内容
  32. */
  33. document.open();
  34. /**
  35. * 现在,将在文档的第一页上添加一些文本。通过 com.lowagie.text.Paragraph
  36. * 来添加文本。可以用文本及其默认的字体、颜色、大小等等设置来创建一个默认段落。
  37. * 或者,也可以设置自己的字体。下面让我们来看看这两种做法。
  38. *
  39. * 创建段落对象
  40. *
  41. */
  42. document.add( new Paragraph( " First page of the document. " ));
  43. document
  44. .add( new Paragraph(
  45. " Some more text on the first page with different color and font type. " ,
  46. FontFactory.getFont(FontFactory.COURIER, 14 ,
  47. Font.BOLD, new Color( 255 , 150 , 200 ))));
  48. /**
  49. * 您已经看到了如何向 PDF文档中添加纯文本。 接下来,需要向文档中添加一些复杂的元素。我们开始创建一个新的章节。
  50. * 章节是一个特殊的小节,默认情况下,章节从一个新的页面开始,并显示一个默认的编号。
  51. *
  52. * 创建章节对象
  53. */
  54. Paragraph title1 = new Paragraph( " Chapter 1 " , FontFactory.getFont(
  55. FontFactory.HELVETICA, 18 , Font.BOLDITALIC, new Color( 0 , 0 ,
  56. 255 )));
  57. Chapter chapter1 = new Chapter(title1, 1 );
  58. chapter1.setNumberDepth( 0 );
  59. /**
  60. * 在上面的代码中,创建了一个新的章节对象,chapter1,其标题为 “This is Chapter 1”,将编号级别设为 0
  61. * 就不会在页面上显示章节编号。
  62. *
  63. * 小节是章节的子元素。在下面的代码中,创建了一个标题为 “This is Section 1 in Chapter 1”
  64. * 的小节。为在该小节下添加一些文本,创建了另一个段落对象,someSectionText,并将其添加到小节对象中。
  65. *
  66. * 创建小节对象
  67. *
  68. */
  69. Paragraph title11 = new Paragraph( " This is Section 1 in Chapter 1 " ,
  70. FontFactory.getFont(FontFactory.HELVETICA, 16 , Font.BOLD,
  71. new Color( 255 , 0 , 0 )));
  72. Section section1 = chapter1.addSection(title11);
  73. Paragraph someSectionText = new Paragraph(
  74. " This text comes as part of section 1 of chapter 1. " );
  75. section1.add(someSectionText);
  76. someSectionText = new Paragraph( " Following is a 3 X 2 table. " );
  77. section1.add(someSectionText);
  78. /**
  79. * 在添加表格之前,我们先看一下文档的样子。添加下面两行代码以关闭文档,然后编译并执行程序以生成 PDF
  80. * 文档:document.add(chapter1);document.close();
  81. */
  82. /**
  83. * 接下来,创建一个表格对象。创建一个包含行列矩阵的表格。行中的单元格可以跨多个列。同样地,列中的单元格也可以跨多个行。 因此,一个
  84. * 3 x 2 的表格实际上不一定有 6 个单元格。
  85. *
  86. * 创建表格对象
  87. */
  88. Table t = new Table( 3 , 2 );
  89. t.setBorderColor( new Color( 220 , 255 , 100 ));
  90. t.setPadding( 5 );
  91. t.setSpacing( 5 );
  92. t.setBorderWidth( 1 );
  93. Cell c1 = new Cell( " header1 " );
  94. t.addCell(c1);
  95. c1 = new Cell( " Header2 " );
  96. t.addCell(c1);
  97. c1 = new Cell( " Header3 " );
  98. t.addCell(c1);
  99. t.addCell( " 1.1 " );
  100. t.addCell( " 1.2 " );
  101. t.addCell( " 1.3 " );
  102. section1.add(t);
  103. /**
  104. * 在上面的代码中,创建了一个表格对象,t,它有三列、两行。然后设置表格的边框颜色。填充用于设置单元格中文本间的间隔以及单元格的边界。
  105. * 间隔指的是相邻单元格间的边界。接下来,将创建三个单元格对象,每个单元格中的文本都各不相同。接下来,将它们添加到表格中。
  106. * 将它们添加到第一行中,从第一列开始,移到同一行中的下一列。一旦该行创建完成,就将下一个单元格添加到下一行的第一列中。
  107. * 也可以通过只提供单元格的文本将单元格添加到表格中,例如,t.addCell("1.1");。最后,将表格对象添加到小节对象中。
  108. *
  109. * 最后,我们来看一下如何将列表添加到 PDF 文档中。列表包含一定数量的
  110. * ListItem。可以对列表进行编号,也可以不编号。将第一个参数设置为 true 表明想创建一个要进行编号的列表。
  111. *
  112. * 创建列表对象
  113. */
  114. List l = new List( true , true , 10 );
  115. l.add( new ListItem( " First item of list " ));
  116. l.add( new ListItem( " Second item of list " ));
  117. section1.add(l);
  118. /**
  119. * 我们已经向 chapter1 对象中添加了所需的对象。因此,已经没有其他要添加到 chapter1 中的元素了,现在可以将
  120. * chapter1 添加到主 document 中了。与在示例应用程序中所做的一样,还要在这时关闭文档对象。
  121. *
  122. * 向主文档中添加章节
  123. */
  124. document.add(chapter1);
  125. document.close();
  126. } catch (Exception e2) {
  127. System.out.println(e2.getMessage());
  128. }
  129. /**
  130. * 您已经看到了一些生成 PDF 的基本元素。iText的美妙之处是相同元素的语法可以供不同类型的写入器使用。
  131. * 而且,写入器的输出可以重定向到控制台(当写入器类型是 XML 和 HTML时)、
  132. * servlet 的输出流(在对 PDF 文档的 Web 请求作出响应时)或者是其他类型的OutputStream。
  133. * 当响应相同,但其类型随所请求的是 PDF、RTF、HTML 或 XML 文档而有所不同时,使用 iText是非常方便的。
  134. * iText 允许用户创建水印,对文档进行加密以及设置其他输出细节。
  135. */
  136. }
  137. }

 

发布人:管理员 【报告错误】·【推荐好友】·【打印文章】
相关评论 本文现有 0 条评论 评分人数: 0 平均分: 0
相关评论
用户名: 密  码:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
注意:请不要在评论中含与内容无关的广告链接,违者封ID
文章搜索
推荐文章
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
热门点击
一个简单的PDF文件结构的分析(22460)
PHP的FDF文档支持(16188)
用C#制作PDF文件全攻略(13629)
Word转换PDF格式的C#或(12146)
pdfMaker文章:PDF加(11643)
ITextRenderer学习(11209)
PDF文件加密仿真(11057)
怎样用iReport制作Web(10413)
iText PDF概述(1)(9921)
循序渐进学习iTextShar(9871)
热门评论
从pdf文档中提取出文本(8)
PDFlib开发:创建超文本元(2)
客户端自动打印PDF(Prin(2)
浅谈PDFlib中文输出(一)(2)
xml的转换之pdf 2 ((1)
xml的转换之pdf 1 (x(1)
PDF知识讲座(1)(1)
PDFBox使用简介(1)
使用正则表达式计算PDF文档的(1)
word转pdf(1)