【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】
iText简介
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。
1、包的引用
1 import java.io.FileNotFoundException; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.net.MalformedURLException; 5 import com.itextpdf.text.Document; 6 import com.itextpdf.text.DocumentException; 7 import com.itextpdf.text.Element; 8 import com.itextpdf.text.Font; 9 import com.itextpdf.text.Font.FontFamily; 10 import com.itextpdf.text.Image; 11 import com.itextpdf.text.PageSize; 12 import com.itextpdf.text.Paragraph; 13 import com.itextpdf.text.Phrase; 14 import com.itextpdf.text.pdf.BaseFont; 15 import com.itextpdf.text.pdf.ColumnText; 16 import com.itextpdf.text.pdf.PdfContentByte; 17 import com.itextpdf.text.pdf.PdfReader; 18 import com.itextpdf.text.pdf.PdfStamper; 19 import com.itextpdf.text.pdf.PdfWriter;
2、创建PDF文件
1 public void createPDF() 2 { 3 try 4 { 5 String RESULT = "F:\\java56班\\eclipse-SDK-4.2-win32\\pdfiText.pdf"; 6 Document document = new Document(); 7 PdfWriter writer = PdfWriter.getInstance(document, 8 new FileOutputStream(RESULT)); 9 document.open(); 10 PdfContentByte canvas = writer.getDirectContentUnder(); 11 writer.setCompressionLevel(0); 12 canvas.saveState(); // q 13 canvas.beginText(); // BT 14 canvas.moveText(36, 788); // 36 788 Td 15 canvas.setFontAndSize(BaseFont.createFont(), 12); // /F1 12 Tf 16 // canvas.showText("Hello World"); // (Hello World)Tj 17 canvas.showText("你好"); // (Hello World)Tj 18 canvas.endText(); // ET 19 canvas.restoreState(); // Q 20 document.close(); 21 } catch (FileNotFoundException e) 22 { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } catch (DocumentException e) 26 { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (IOException e) 30 { 31 // TODO Auto-generated catch block 32 e.printStackTrace(); 33 } 34 } 35 36 public void createPDF2() 37 { 38 try 39 { 40 String RESULT = "F:\\java56班\\eclipse-SDK-4.2-win32\\pdfiText.pdf"; 41 Document document = new Document(); 42 PdfWriter writer = PdfWriter.getInstance(document, 43 new FileOutputStream(RESULT)); 44 document.open(); 45 writer.setCompressionLevel(0); 46 // Phrase hello = new Phrase("Hello World"); 47 Phrase hello = new Phrase("你好"); 48 PdfContentByte canvas = writer.getDirectContentUnder(); 49 ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, hello, 200, 50 800, 0); 51 document.close(); 52 } catch (FileNotFoundException e) 53 { 54 // TODO Auto-generated catch block 55 e.printStackTrace(); 56 } catch (DocumentException e) 57 { 58 // TODO Auto-generated catch block 59 e.printStackTrace(); 60 } 61 } 62 63 public void createPDF3() 64 { 65 try 66 { 67 String resource_jpg = "F:\\java56班\\eclipse-SDK-4.2-win32\\1.png";// 68 String RESULT = "F:\\java56班\\eclipse-SDK-4.2-win32\\pdfiText.pdf"; 69 Paragraph p = new Paragraph("Foobar Film Festival", new Font(FontFamily.HELVETICA, 24)); 70 p.setAlignment(Element.ALIGN_CENTER); 71 Document document = new Document();// 72 PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(RESULT)); 73 document.open(); 74 document.add(p); 75 Image img = Image.getInstance(resource_jpg); 76 img.setAbsolutePosition( 77 (PageSize.POSTCARD.getWidth() - img.getScaledWidth()) / 2, 78 (PageSize.POSTCARD.getHeight() - img.getScaledHeight()) / 2); 79 80 // img.setAbsolutePosition(0, 0); 81 document.add(img); 82 document.newPage(); 83 document.add(p); 84 document.add(img); 85 PdfContentByte over = writer.getDirectContent(); 86 over.saveState(); 87 float sinus = (float) Math.sin(Math.PI / 60); 88 float cosinus = (float) Math.cos(Math.PI / 60); 89 BaseFont bf = BaseFont.createFont(); 90 over.beginText(); 91 over.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE); 92 over.setLineWidth(1.5f); 93 over.setRGBColorStroke(0xFF, 0x00, 0x00); 94 over.setRGBColorFill(0xFF, 0xFF, 0xFF); 95 over.setFontAndSize(bf, 36); 96 over.setTextMatrix(cosinus, sinus, -sinus, cosinus, 50, 324); 97 over.showText("SOLD OUT"); 98 over.endText(); 99 over.restoreState(); 100 PdfContentByte under = writer.getDirectContentUnder(); 101 under.saveState(); 102 under.setRGBColorFill(0xFF, 0xD7, 0x00); 103 under.rectangle(5, 5, PageSize.POSTCARD.getWidth() - 10, 104 PageSize.POSTCARD.getHeight() - 10); 105 under.fill(); 106 under.restoreState(); 107 108 document.close(); 109 } catch (FileNotFoundException e) 110 { 111 // TODO Auto-generated catch block 112 e.printStackTrace(); 113 } catch (DocumentException e) 114 { 115 // TODO Auto-generated catch block 116 e.printStackTrace(); 117 } catch (MalformedURLException e) 118 { 119 // TODO Auto-generated catch block 120 e.printStackTrace(); 121 } catch (IOException e) 122 { 123 // TODO Auto-generated catch block 124 e.printStackTrace(); 125 } 126 }
3、在绝对位置插入图片
1 public void addImageAbsolu() 2 { 3 try 4 { 5 String resource_jpg = "F:\\java56班\\eclipse-SDK-4.2-win32\\1.png";// 6 String RESULT = "F:\\java56班\\eclipse-SDK-4.2-win32\\pdfiText.pdf"; 7 Document document = new Document(); 8 PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(RESULT)); 9 document.open(); 10 // PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get( 0 ); 11 Image img = Image.getInstance(resource_jpg); 12 img.setAbsolutePosition( 13 (PageSize.POSTCARD.getWidth() - img.getScaledWidth()) / 2, 14 (PageSize.POSTCARD.getHeight() - img.getScaledHeight()) / 2); 15 16 // img.setAbsolutePosition(0, 0); 17 document.add(img); 18 document.close(); 19 } catch (FileNotFoundException e) 20 { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } catch (DocumentException e) 24 { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } catch (MalformedURLException e) 28 { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } catch (IOException e) 32 { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 } 37 38 public void addImageAbsolu2() 39 { 40 try 41 { 42 String resource_jpg = "F:\\java56班\\eclipse-SDK-4.2-win32\\1.png";// 43 String result = "F:\\java56班\\eclipse-SDK-4.2-win32\\pdfiText.pdf"; 44 String result2 = "F:\\java56班\\eclipse-SDK-4.2-win32\\pdfiText2.pdf"; 45 //创建一个pdf读入流 46 PdfReader reader = new PdfReader(result); 47 //根据一个pdfreader创建一个pdfStamper.用来生成新的pdf. 48 PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(result2)); 49 //获得pdfstamper在当前页的上层打印内容.也就是说 这些内容会覆盖在原先的pdf内容之上. 50 PdfContentByte over = stamper.getOverContent(0); 51 52 53 Document document = new Document(); 54 PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(result)); 55 document.open(); 56 // PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get( 0 ); 57 Image img = Image.getInstance(resource_jpg); 58 img.setAbsolutePosition(0, 0); 59 document.add(img); 60 document.close(); 61 } catch (FileNotFoundException e) 62 { 63 // TODO Auto-generated catch block 64 e.printStackTrace(); 65 } catch (DocumentException e) 66 { 67 // TODO Auto-generated catch block 68 e.printStackTrace(); 69 } catch (MalformedURLException e) 70 { 71 // TODO Auto-generated catch block 72 e.printStackTrace(); 73 } catch (IOException e) 74 { 75 // TODO Auto-generated catch block 76 e.printStackTrace(); 77 } 78 }
4、PDF文件转换为图片
package demo1; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.util.ImageIOUtil; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; public class PdfPageToImg { /** * PDFBOX转图片 * * @param pdfUrl * pdf的路径 * @param imgTempUrl * 图片输出路径 */ public static void pdfToImage(String pdfUrl, String imgTempUrl) { try { // 读入PDF PdfReader pdfReader = new PdfReader(pdfUrl); // 计算PDF页码数 int pageCount = pdfReader.getNumberOfPages(); // 循环每个页码 for (int i = pageCount; i >= pdfReader.getNumberOfPages(); i--) { ByteArrayOutputStream out = new ByteArrayOutputStream(); PdfStamper pdfStamper = null; PDDocument pdDocument = null; pdfReader = new PdfReader(pdfUrl); pdfReader.selectPages(String.valueOf(i)); pdfStamper = new PdfStamper(pdfReader, out); pdfStamper.close(); // 利用PdfBox生成图像 pdDocument = PDDocument.load(new ByteArrayInputStream(out .toByteArray())); OutputStream outputStream = new FileOutputStream(imgTempUrl + "ImgName" + "-" + i + ".bmp"); ImageOutputStream output = ImageIO .createImageOutputStream(outputStream); PDPage page = (PDPage) pdDocument.getDocumentCatalog() .getAllPages().get(0); BufferedImage image = page.convertToImage( BufferedImage.TYPE_INT_RGB, 96); ImageIOUtil.writeImage(image, "bmp", outputStream, 96); if (output != null) { output.flush(); output.close(); } pdDocument.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String pdfUrl = "F:\\java56班\\eclipse-SDK-4.2-win32\\iText入门基础教程[2].pdf"; String imgTempUrl = "F:\\java56班\\eclipse-SDK-4.2-win32\\img\\"; pdfToImage(pdfUrl, imgTempUrl); } }
5、图片集转换为PDF文件
1 package demo1; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import com.itextpdf.text.Document; 7 import com.itextpdf.text.DocumentException; 8 import com.itextpdf.text.Image; 9 import com.itextpdf.text.Rectangle; 10 import com.itextpdf.text.pdf.PdfWriter; 11 12 public class ImgToPDF 13 { 14 15 /** 16 * 17 * @param destPath 18 * 生成pdf文件的路劲 19 * @param images 20 * 需要转换的图片路径的数组 21 * @throws IOException 22 * @throws DocumentException 23 */ 24 public static void imagesToPdf(String destPath, String imagesPath) 25 { 26 try 27 { 28 // 第一步:创建一个document对象。 29 Document document = new Document(); 30 document.setMargins(0, 0, 0, 0); 31 // 第二步: 32 // 创建一个PdfWriter实例, 33 PdfWriter.getInstance(document, new FileOutputStream(destPath)); 34 // 第三步:打开文档。 35 document.open(); 36 // 第四步:在文档中增加图片。 37 File files = new File(imagesPath); 38 String[] images = files.list(); 39 int len = images.length; 40 41 for (int i = 0; i < len; i++) 42 { 43 if (images[i].toLowerCase().endsWith(".bmp")) 44 { 45 String temp = imagesPath + "\\" + images[i]; 46 Image img = Image.getInstance(temp); 47 img.setAlignment(Image.ALIGN_CENTER); 48 // 根据图片大小设置页面,一定要先设置页面,再newPage(),否则无效 49 document.setPageSize(new Rectangle(img.getWidth(), img 50 .getHeight())); 51 document.newPage(); 52 document.add(img); 53 } 54 } 55 // 第五步:关闭文档。 56 document.close(); 57 } catch (Exception e) 58 { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 } 62 } 63 64 public static void main(String[] args) 65 { 66 String destPath = "F:\\java56班\\eclipse-SDK-4.2-win32\\img\\imagesToPdf.pdf"; 67 String imagesPath = "F:\\java56班\\eclipse-SDK-4.2-win32\\img\\"; 68 imagesToPdf(destPath, imagesPath); 69 } 70 71 }
2015-01-26