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

点(磅)(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 文档:

 package com.demo.util.iText;

 import java.io.File;
import java.io.FileOutputStream; import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;
/**
*
* @author wangbo
*
*/
public class test { public static void main(String[] args) { try { String pdfUrl = "C:\\Users\\Administrator\\Desktop\\测试版.pdf";
String fileUrl = "C:/Users/Administrator/Desktop/test/"; //建立com.itextpdf.text.Document对象的实例
Document doc = new Document(PageSize.A4, 0, 0, 0, 0);
//建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中
PdfWriter.getInstance(doc, new FileOutputStream(pdfUrl));
//打开文档
doc.open(); File file = new File(fileUrl);
if (file.isDirectory()) {
File[] list = file.listFiles();
Image png = null;
for (File file2 : list) {
png = Image.getInstance(file2.getAbsolutePath());
//根据图片像素设置图片的大小,单位是磅
png.scaleAbsolute(png.getWidth()/300*72, png.getHeight()/300*72);
System.out.println(png.getScaledWidth()+ "*" +png.getScaledHeight());
//根据图片大小设置页面的大小
Rectangle pageSize = new Rectangle(png.getScaledWidth(), png.getScaledHeight());
doc.setPageSize(pageSize);
//新加一页
doc.newPage();
//将图片放入文档中
doc.add(png);
}
} //关闭文档
doc.close(); //进行pdf文件生产
File pdfFile = new File(pdfUrl);
if (pdfFile.exists()) {
pdfFile.createNewFile();
} } catch (Exception e) {
e.printStackTrace();
} } }

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

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

PDF 报表 Java 组件 iText5 中的单位注意事项的更多相关文章

  1. java 组件开发中的日志记录问题

    今天帮别人写封装几个url 请求,打成jar 包,可以以java接口的方式提供给外部访问. 遇到两个问题: 1. 是否把依赖的jar包也 打入 我要生成的jar包中,如果你不打入,别人直接调用接口会报 ...

  2. .NET平台开源文档与报表处理组件包括Execel PDF Word等

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

  3. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

  4. 【java】浅析java组件中的布局管理器

    这篇博文笔者介绍一下java组件中,常用的布局管理器.java组件中的布局方式有好几十种,所有的这些布局管理器都实现了java.awt.LayoutManager接口.接下来笔者介绍一下常用的5种布局 ...

  5. 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

  6. JAVA、android中常用的一些jar包的作用

    正文: 这里主要介绍的是hibernate使用到的.jar Hibernate一共包括了23个jar包,令人眼花缭乱.本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进 ...

  7. HighCharts SVN IReport进行PDF报表设计--模板

    BOS物流项目笔记第十五天 HIghcharts是很强大的图表绘制插件,它是基于纯js绘制的.当然地,对于图表也会有很多操作了.下面就我工作时遇到的一些比较常见的highcharts的操作进行小结,不 ...

  8. 【转】java.util.vector中的vector的详细用法

    [转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

  9. 使用JSP页面生成PDF报表

    转自:http://developer.51cto.com/art/200907/134261.htm 1.iText简介 iText是一个开放源码的Java类库,可以用来方便地生成PDF文件.大家通 ...

随机推荐

  1. linux-kernel-4.4 移植 (1)启动

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  2. Gmapping笔记

    2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM 作者:kint_zhao 原文:https://blog. ...

  3. JavaScript new Date()在Safari上的坑

    问题描述 我们经常用yyyy-MM-dd HH:mm:ss格式表示日期,如2018-11-11 00:00:00,在js开发中也经常会把此格式字符串格式化为javascript Date类型,如new ...

  4. flask debug 模式开启

    debug 模式开启 最近在写python flask 的Waf后台管理界面,想要启用调试模式,发现安装目前网上流行的两种方式均无法在我的Pycharm中打开调试模式. )直接在对象上设置 app.d ...

  5. docker安装nginx和php

    参考文章:https://www.cnblogs.com/boundless-sky/p/7182410.html 1.下载镜像docker pull nginxdocker pull php:7.2 ...

  6. dede织梦后台-退出空白,注销空白,打开空白,登录返回首页,登录返回登录页面

    24.php 5.4版本 后台500错误,打开空白的问题 不兼容 登录时空白 后台空白 24-1./include/userlogin.class.php 今天把电脑上的phpStudy升级到2013 ...

  7. Itreatot接口实现类中modCount的作用

    modCount只有在本数据结构对应迭代器中才使用,以HashMap为例: private abstract class HashIterator implements Iterator { Entr ...

  8. mac mysql5.7.17修改root初始密码(知道初始密码)

    最近在mac上装个mysql可以说是麻烦死了,在这里就说说修改初始密码吧! 刚开始的时候不知道怎么修改,于是上网百度,网上几乎都是说要先执行命令mysqld_safe --skip-grant-tab ...

  9. linux crontab 命令,最小的执行时间是一分钟,如需要在小于一分钟内重复执行

    编写shell脚本实现 crontab.sh #!/bin/bash step=2 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do $ ...

  10. SQL Server数据库设置自动备份策略

    一. 简单介绍 SQL Server自带的维护计划是一个非常有用的维护工具,能够完成大部分的数据库的维护任务. 数据库的备份也是日常工作中非常重要的一个环节.备份的方法非常的多. 今天给大家介绍最简单 ...