PDF 报表 Java 组件 iText5 中的单位注意事项

这里面涉及到这几个单位:

点(磅)(pt)、像素(px)、英寸(inch)、毫米(mm)

分辨率单位有:

dpi(点每英寸):出现于打印或印刷领域。

lpi (线每英寸):描述光学分辨率的尺度。

ppi(像素每英寸):存在于电脑显示领域。

下面举一个例子进行说明,比如:

一个图片 test.jpg 的像素是 2468*3437

Image png = Image.getInstance(imagePath);
png.getWidth(); //获取到的是2468
png.getHeight(); //获取到的是3437

单位都是像素 px。

默认的度量系统大多以排版单位为基础得出其他单位的近似值,iText 中 PageSize 使用的单位就是“磅”,所以设置 PageSize 大小的时候需要将“像素”转化为“磅”。

换算过程是这样的:

1inch = 72pt = 25.4mm

这里按照 300ppi 的分辨率进行计算(为什么是300呢?这是我们公司规定的冲印分辨率),则图片的宽度由 px 换算为 pt 就是:

2468px / 300ppi * 72pt = 210pt

所以,应该这样获取 PageSize。

Rectangle pageSize = new Rectangle(png.getWidth()/300*72, png.getHeight()/300*72);

下面是根据我们公司需求写的代码,需求是将一个目录下的图片按照原尺寸合成为PDF文档,现在开始测试,将桌面上test目录下的图片合成为 测试版.pdf 文档:

 1 package com.demo.util.iText;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 
 6 import com.itextpdf.text.Document;
 7 import com.itextpdf.text.Image;
 8 import com.itextpdf.text.PageSize;
 9 import com.itextpdf.text.Rectangle;
10 import com.itextpdf.text.pdf.PdfWriter;
11 /**
12  * 
13  * @author wangbo
14  *
15  */
16 public class test {
17     
18     public static void main(String[] args) {
19         
20         try {
21             
22              String pdfUrl = "C:\\Users\\Administrator\\Desktop\\测试版.pdf";
23              String fileUrl = "C:/Users/Administrator/Desktop/test/";
24              
25              //建立com.itextpdf.text.Document对象的实例
26              Document doc = new Document(PageSize.A4, 0, 0, 0, 0);
27              //建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中
28              PdfWriter.getInstance(doc, new FileOutputStream(pdfUrl));
29              //打开文档
30              doc.open();
31              
32              File file = new File(fileUrl);
33              if (file.isDirectory()) {
34                  File[] list = file.listFiles();
35                  Image png = null;
36                  for (File file2 : list) {
37                      png = Image.getInstance(file2.getAbsolutePath());
38                      //根据图片像素设置图片的大小,单位是磅
39                      png.scaleAbsolute(png.getWidth()/300*72, png.getHeight()/300*72);
40                      System.out.println(png.getScaledWidth()+ "*" +png.getScaledHeight());
41                      //根据图片大小设置页面的大小
42                      Rectangle pageSize = new Rectangle(png.getScaledWidth(), png.getScaledHeight());
43                      doc.setPageSize(pageSize);
44                      //新加一页
45                      doc.newPage();
46                      //将图片放入文档中
47                      doc.add(png);
48                  }
49              }
50              
51              //关闭文档
52              doc.close();
53              
54              //进行pdf文件生产
55              File pdfFile = new File(pdfUrl);
56              if (pdfFile.exists()) {
57                  pdfFile.createNewFile();
58              }
59             
60         } catch (Exception e) {
61             e.printStackTrace();
62         }
63         
64     }
65     
66 }

补充一下:我这用的是iText5,没研究iText7,据说这两相差的还比较大,需要的jar包有:(其中的clover包生成World文档的时候能用到)

 再补充一篇网上找的帮助文档:https://files.cnblogs.com/files/wbyp/iText中文教程%28含代码%29.pdf

posted @ 2017-07-05 17:24  一线大码  Views(1489)  Comments(0Edit  收藏  举报