Java iText生成PDF文档

版权声明:本文为博主原创文章,未经博主允许不得转载。https://mp.csdn.net/mdeditor/83963600#

1、简介
iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。iText的安装非常方便,在http://itextpdf.com/ 网站上下载itextpdf.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。
2、生成一个PDF文档基本步骤
2.1建立com.itextpdf.text.Document对象的实例。
Document document = new Document();

2.2建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。

PdfWriter writer=PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF")); 
writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
//通过public Rectangle(float llx, float lly, float urx, float ury)可以随意改变左下角的位置。。
Rectangle rect = new Rectangle(36,36,559,788); 
rect.setBorderColor(BaseColor.BLACK);  
writer.setBoxSize("art", rect);
HeaderFooter header=new HeaderFooter();  
//Itext提供了一个很实用的类PageSize,它的作用就是返回static final Rectangle对象的集合。提供了标准化的页面大小。如下所示即为A4页面大小。
document.setPageSize(PageSize.A4);

如果想横向打印 则设置如下:其中函数rotate()即为控制横向显示函数。

Document document = new Document(PageSize.A4.rotate()); 

2.3、打开文档:

document.open();

2.4、把内容写入文档:

document.add(new Paragraph("Hello World"));

2.5关闭文档:

document.close();

3、iText创建文本
iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:

Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE)); 

短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块 (Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中, 如:

  Phrase phr=new Phrase();
  phr.add(chunk);

段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落 的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方 式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。
  基本代码实例如下:

document.add(new Paragraph("\r\n\r\n\r\n\r\n"));
//创建段落
 Paragraph p=new Paragraph();
 //设置段落字体大小
 p.setFont(TestPdf.bigmaxfont);
 //设置段落水平居中显示
 p.setAlignment(Element.ALIGN_CENTER);
 //添加段落文字
 p.add("Helloworld pdf !");
 //设置行间距
 p.setLeading(20.0f);
 //添加到Document对象的实例中。
 document.add(p);

4、iText创建表格
iText中处理表格有点复杂,下面我们先介绍一下表格创建的基本流程,创建代码如下所示:

//创建表格实例对象,其中6为表格的列数。
PdfPTable table = new PdfPTable(6);
//设置表格宽度。
table .setTotalWidth(495);
PdfPCell cell = new PdfPCell(); 
//设置边框色
cellsetBorderColor(color);
//设置单元格的最小高度
cell.setMinimumHeight(FixedHeight);
//设置垂直居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);    
//设置水平居中
cell.setHorizontalAlignment(Element.ALIGN_CENTER);    
 //设置单元格占几列,此处主要为表格中合并单元格使用,可用setRowspan设置单元格占的行数。    
cell.setColspan(colspan);    
//设置字体
cell.setPhrase(new com.itextpdf.text.Phrase(value,font));
//设置单元格的Padding值
cell.setPaddingLeft(1);
cell.setPaddingRight(1);
cell.setPaddingTop(5.0f);    
cell.setPaddingBottom(5.0f);
//设置行间距。fixedLeading,multipliedLeading
cell.setLeading(1f,1f );
//将PdfPCell对象添加到表格中。
table.addCell(cell)

值得注意的注意的在我们使用 cell.setColspan(colspan)或cell.setRowspan(colspan)合并单元格时,当一行合并出错时,下面的行列将全部出错,这时我们只需要修正出错行即可。
5、图片处理
iText中处理图片的类为com.itextpdf.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。

Image img = Image.getInstance(imgfilepath);//imgfilepath可以是GIF, Jpeg, PNG, wmf等格式的图片

5.1、图像的位置
图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数public void setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、 左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这 两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字 围绕图像显示。
5.2、图像的尺寸和旋转
  如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:

   public void scaleAbsolute(int newWidth, int newHeight)
  public void scalePercent(int percent)
  public void scalePercent(int percentX, int percentY) 

函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(int percentX, int percentY)则图像高宽的显示比例。

如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。
6、iText水印
在iText添加水印时可有两种方式,第一种是文本水印;第二种是图片水印。
6.1、iText文本水印
添加文本水印的代码如下所示:

   import java.io.FileNotFoundException;
   import java.io.FileOutputStream; 
   import java.io.IOException; 
   import com.itextpdf.text.BaseColor;
   import com.itextpdf.text.Document;
   import com.itextpdf.text.DocumentException;
   import com.itextpdf.text.Element; 
   import com.itextpdf.text.PageSize; 
   import com.itextpdf.text.pdf.BaseFont; 
   import com.itextpdf.text.pdf.PdfContentByte; 
   import com.itextpdf.text.pdf.PdfGState; 
   import com.itextpdf.text.pdf.PdfWriter; 
   public class pdfDemo {
    public static void main(String[] args) throws FileNotFoundException, DocumentException { 
    //创建实例实现A4纸页面
    Document document = new Document(PageSize.A4); 
    PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream("d:/demo.pdf")); 
    document.open();
     // 加入水印 
     PdfContentByte waterMar = pdfWriter.getDirectContentUnder();
      // 开始设置水印 
      waterMar.beginText(); 
      // 设置水印透明度 
      PdfGState gs = new PdfGState();
       // 设置填充字体不透明度为0.4f 
       gs.setFillOpacity(0.4f);
        try {
         // 设置水印字体参数及大小 (字体参数,字体编码格式,是否将字体信息嵌入到pdf中(一般不需要嵌入),字体大小) 
         waterMar.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 80);
          // 设置透明度 
          waterMar.setGState(gs); 
          // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度 
          waterMar.showTextAligned(Element.ALIGN_RIGHT, "www.itextpdf.com" , 500, 500, 50); 
          // 设置水印颜色 
          waterMar.setColorFill(BaseColor.GRAY); 
          //结束设置 
          waterMar.endText(); 
          waterMar.stroke(); 
       } catch (IOException e) {
        e.printStackTrace(); 
        }finally { 
        waterMar = null; 
        gs = null;
         }
          // 关闭文档 
          document.close();
          pdfWriter.close(); 
        } 
     }

6.2、iText图片水印
图片水印与文本水印有些相似,具体操作代码如下所示:

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Element; 
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.pdf.BaseFont; 
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState; 
import com.itextpdf.text.pdf.PdfWriter; 
public class pdfDemo{ 
   public static void main(String[] args) throws FileNotFoundException, DocumentException { 
   Document document = new Document(PageSize.A4); 
   PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream("d:/demo.pdf")); 
   // 打开文档 
   document.open(); 
   document.newPage(); 
   // 加入水印 
   PdfContentByte waterMar = pdfWriter.getDirectContentUnder(); 
   // 开始设置水印 
   waterMar.beginText(); 
   // 设置水印透明度 
   PdfGState gs = new PdfGState(); 
   // 设置字体不透明度为0.4f 
   gs.setStrokeOpacity(0.4f); 
   try { 
   Image image = Image.getInstance("d:/demo.jpg"); 
   // 设置坐标 绝对位置 X Y
   image.setAbsolutePosition(300, 300); 
   // 设置旋转弧度
   image.setRotation(30);
   // 旋转 弧度 // 设置旋转角度 
   image.setRotationDegrees(50);
   // 旋转 角度 // 设置等比缩放 
   image.scalePercent(90);
   // 依照比例缩放 
   // image.scaleAbsolute(200,200);
   //自定义大小 // 设置透明度 
   waterMar.setGState(gs);
    // 添加水印图片 
    waterMar.addImage(image); 
    // 设置透明度 
    waterMar.setGState(gs); 
    //结束设置 
    waterMar.endText(); 
    waterMar.stroke(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    }finally { 
    waterMar = null; 
    gs = null;
     } 
      // 关闭文档 
      document.close();
       pdfWriter.close(); 
       } 
    }

6.3、添加水印并铺满全页
在实际需求中有时候我们还会遇到另外一种情况:添加水印并铺满全页。处理示例如下所示:

import java.io.FileOutputStream;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
 
public class TestwaterMark {
	private static int interval = -5;   
	public static void waterMark(String inputFile,    
            String outputFile, String waterMarkName) {    
        try {    
            PdfReader reader = new PdfReader(inputFile);    
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(    
                    outputFile));    
            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",   BaseFont.EMBEDDED);  
            Rectangle pageRect = null;  
            // 设置水印透明度 
            PdfGState gs = new PdfGState();  
            gs.setFillOpacity(0.3f);  
             // 设置字体不透明度为0.4f 
            gs.setStrokeOpacity(0.4f);  
            //文档页数。
            int total = reader.getNumberOfPages() + 1;   
            //水印最大高度
            int textH =30;   
            int textW =30;   
            PdfContentByte under;    
            for (int i = 1; i < total; i++) {   
                pageRect = reader.getPageSizeWithRotation(i);   
                under = stamper.getOverContent(i);   
                under.saveState();  
                under.setGState(gs);  
                under.beginText();    
                under.setFontAndSize(base, 20);    
               
                // 水印文字成30度角倾斜  
                //你可以随心所欲的改你自己想要的角度
                for (int height = interval + textH; height < pageRect.getHeight();  
                        height = height + textH*3) {    
                    for (int width = interval + textW; width < pageRect.getWidth() + textW;   
                            width = width + textW*2) {  
                under.showTextAligned(Element.ALIGN_LEFT  
                        , waterMarkName, width - textW,  
                        height - textH, 30);  
                    }  
                }  
                // 添加水印文字    
                under.endText();    
            }   
            stamper.close();  
            reader.close();
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
    }    
 
	public static void main(String[] args) {
		 waterMark("c:/test.pdf", "c:/test1.pdf", "test");  
 
	}
 
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值