java中利用itext编辑pdf

最近项目需要,在调研如何在pdf中增加标识字样,用来区分版本.最后确定用itext来实现.

itext的官网是:http://www.itextpdf.com/

代码如下:

Java代码 复制代码 收藏代码
  1. /**
  2. * authory kingviker
  3. * time : 2012-12-12
  4. */
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import com.itextpdf.text.DocumentException;
  8. import com.itextpdf.text.Font;
  9. import com.itextpdf.text.Image;
  10. import com.itextpdf.text.pdf.BaseFont;
  11. import com.itextpdf.text.pdf.PdfArray;
  12. import com.itextpdf.text.pdf.PdfContentByte;
  13. import com.itextpdf.text.pdf.PdfDictionary;
  14. import com.itextpdf.text.pdf.PdfName;
  15. import com.itextpdf.text.pdf.PdfObject;
  16. import com.itextpdf.text.pdf.PdfReader;
  17. import com.itextpdf.text.pdf.PdfStamper;
  18. public class AddContentToPDF {
  19. public static void main(String[] args) throws IOException, DocumentException {
  20. //创建一个pdf读入流
  21. PdfReader reader = new PdfReader("C:/help.pdf");
  22. //根据一个pdfreader创建一个pdfStamper.用来生成新的pdf.
  23. PdfStamper stamper = new PdfStamper(reader,
  24. new FileOutputStream("C:/help2.pdf"));
  25. //这个字体是itext-asian.jar中自带的 所以不用考虑操作系统环境问题.
  26. BaseFont bf = BaseFont.createFont("STSong-Light",
  27. "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // set font
  28. //baseFont不支持字体样式设定.但是font字体要求操作系统支持此字体会带来移植问题.
  29. Font font = new Font(bf,10);
  30. font.setStyle(Font.BOLD);
  31. font.getBaseFont();
  32. //页数是从1开始的
  33. for (int i=1; i<=reader.getNumberOfPages(); i++){
  34. //获得pdfstamper在当前页的上层打印内容.也就是说 这些内容会覆盖在原先的pdf内容之上.
  35. PdfContentByte over = stamper.getOverContent(i);
  36. //用pdfreader获得当前页字典对象.包含了该页的一些数据.比如该页的坐标轴信息.
  37. PdfDictionary p = reader.getPageN(i);
  38. //拿到mediaBox 里面放着该页pdf的大小信息.
  39. PdfObject po = p.get(new PdfName("MediaBox"));
  40. System.out.println(po.isArray());
  41. //po是一个数组对象.里面包含了该页pdf的坐标轴范围.
  42. PdfArray pa = (PdfArray) po;
  43. System.out.println(pa.size());
  44. //看看y轴的最大值.
  45. System.out.println(pa.getAsNumber(pa.size()-1));
  46. //开始写入文本
  47. over.beginText();
  48. //设置字体和大小
  49. over.setFontAndSize(font.getBaseFont(), 10);
  50. //设置字体的输出位置
  51. over.setTextMatrix(107, 540);
  52. //要输出的text
  53. over.showText("我要加[终稿]字样 " + i);
  54. over.endText();
  55. //创建一个image对象.
  56. Image image = Image.getInstance("c:/1.jpg");
  57. //设置image对象的输出位置pa.getAsNumber(pa.size()-1).floatValue() 是该页pdf坐标轴的y轴的最大值
  58. image.setAbsolutePosition(0,pa.getAsNumber(pa.size()-1).floatValue()-100);//0, 0, 841.92, 595.32
  59. over.addImage(image);
  60. //画一个圈.
  61. over.setRGBColorStroke(0xFF, 0x00, 0x00);
  62. over.setLineWidth(5f);
  63. over.ellipse(250, 450, 350, 550);
  64. over.stroke();
  65. }
  66. stamper.close();
  67. }
  68. }  
/**
 * authory kingviker 
 * time : 2012-12-12
 */
import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfArray;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfObject;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class AddContentToPDF {

    public static void main(String[] args) throws IOException, DocumentException {

    	//创建一个pdf读入流
        PdfReader reader = new PdfReader("C:/help.pdf"); 
        //根据一个pdfreader创建一个pdfStamper.用来生成新的pdf.
        PdfStamper stamper = new PdfStamper(reader,
          new FileOutputStream("C:/help2.pdf")); 
        
        //这个字体是itext-asian.jar中自带的 所以不用考虑操作系统环境问题.
        BaseFont bf = BaseFont.createFont("STSong-Light", 
                "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // set font
        //baseFont不支持字体样式设定.但是font字体要求操作系统支持此字体会带来移植问题.
        Font font = new Font(bf,10);
        font.setStyle(Font.BOLD);
        font.getBaseFont();
        //页数是从1开始的
        for (int i=1; i<=reader.getNumberOfPages(); i++){

           //获得pdfstamper在当前页的上层打印内容.也就是说 这些内容会覆盖在原先的pdf内容之上.
            PdfContentByte over = stamper.getOverContent(i);
            //用pdfreader获得当前页字典对象.包含了该页的一些数据.比如该页的坐标轴信息.
            PdfDictionary p = reader.getPageN(i);
            //拿到mediaBox 里面放着该页pdf的大小信息.
           PdfObject po =  p.get(new PdfName("MediaBox"));
           System.out.println(po.isArray());
           //po是一个数组对象.里面包含了该页pdf的坐标轴范围.
           PdfArray pa = (PdfArray) po;
           System.out.println(pa.size());
           //看看y轴的最大值.
           System.out.println(pa.getAsNumber(pa.size()-1));
            //开始写入文本
            over.beginText();
            //设置字体和大小
            over.setFontAndSize(font.getBaseFont(), 10); 
            //设置字体的输出位置
            over.setTextMatrix(107, 540); 
            //要输出的text
            over.showText("我要加[终稿]字样 " + i);  
            over.endText();
            //创建一个image对象.
            Image image = Image.getInstance("c:/1.jpg");
            //设置image对象的输出位置pa.getAsNumber(pa.size()-1).floatValue() 是该页pdf坐标轴的y轴的最大值
            image.setAbsolutePosition(0,pa.getAsNumber(pa.size()-1).floatValue()-100);//0, 0, 841.92, 595.32
            over.addImage(image);
           
            //画一个圈.
            over.setRGBColorStroke(0xFF, 0x00, 0x00);
            over.setLineWidth(5f);
            over.ellipse(250, 450, 350, 550);
            over.stroke();
        }

        stamper.close();

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值