业务需求:
一个电信系统的业务需要将其他异构计费系统导出的pdf中数据导入到本java开发的计费统计系统,
pdf格式:
日期 2010-10-11 用户 王家辉
长途费 50 短信 50
1页
最后在本系统创建一张表,可以按时间查询,并要统计各种费用.
下面说一下自己的思路:
先解析pdf,根据x,y坐标解析
这个按时间统计,首先要在时间上分表分区
然后再时间这个字段做一个索引
按顺序读取,放入一个map中,最后放到一个容器中,传到后台,后台在将这个容器迭代,用key找value
关于PDF和JAVA的资料,国内实在是太少了;我想可能是由于国内的PDF开发人员不多的缘故吧。 所以,我想把自己研究出来的一点东西放到csdn上。 希望会对其他的开发者有所帮助。。。
先说说坐标系的概念 ,这个大家应该都不是很陌生了。也就是我们要做屏幕上或者其他的输出设备上做出图形,当然需要知道一系列点的坐标。 不过一切点的坐标都是通过坐标系来标识的, 如(100,100)
java的坐标(0,0)是从屏幕的左上角开始的,而PDF的(0,0)是从屏幕的左下角开始的。所以两个坐标系的Y坐标系正好是颠倒的。
所以这时假设我们有个坐标 (100,100) 那么在两个坐标系中的X坐标是相同的 不过Y坐标可能就会差的很远了。 下面看看怎么做能让java的坐标变成PDF的坐标?
Graphics2D g2 = (Graphics2D) g;
g2.translate(400, 400);//为了更方便 把0,0移到400,400
g2.drawLine(0, 0, 500, 0);
g2.drawLine(0, 0, 0, 300);
此时这条线的y方向是向下的(因为java的y轴正方向是向下为证的)
AffineTransform pdftransformation = new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
AffineTransform pdftransformation = new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
AffineTransform javatransformation = new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
pdftransformation.concatenate(javatransformation);
g2.transform(pdftransformation);
上面的几句话就很难解释了 。
用代数式写可以写成 x' =x ,y'=-y
g2.drawLine(100, 100, 500, 100);
g2.drawLine(100, 100, 100, 300);
在画线的时候 这次Y轴就向上了 因为此时每向draw方法里传值 其Y坐标都会变成-y 然后再以java坐标系绘出 。 也就是说所有的点Y坐标都需要变化一次(这里是成负数)再以java坐标系画出。
直接的理解就是 在这时 ,传正值给draw方法 y如果是正数 就向上了。
有关
AffineTransform pdftransformation = new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
AffineTransform javatransformation = new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
pdftransformation.concatenate(javatransformation);
一个电信系统的业务需要将其他异构计费系统导出的pdf中数据导入到本java开发的计费统计系统,
pdf格式:
日期 2010-10-11 用户 王家辉
长途费 50 短信 50
1页
最后在本系统创建一张表,可以按时间查询,并要统计各种费用.
下面说一下自己的思路:
先解析pdf,根据x,y坐标解析
这个按时间统计,首先要在时间上分表分区
然后再时间这个字段做一个索引
按顺序读取,放入一个map中,最后放到一个容器中,传到后台,后台在将这个容器迭代,用key找value
关于PDF和JAVA的资料,国内实在是太少了;我想可能是由于国内的PDF开发人员不多的缘故吧。 所以,我想把自己研究出来的一点东西放到csdn上。 希望会对其他的开发者有所帮助。。。
先说说坐标系的概念 ,这个大家应该都不是很陌生了。也就是我们要做屏幕上或者其他的输出设备上做出图形,当然需要知道一系列点的坐标。 不过一切点的坐标都是通过坐标系来标识的, 如(100,100)
java的坐标(0,0)是从屏幕的左上角开始的,而PDF的(0,0)是从屏幕的左下角开始的。所以两个坐标系的Y坐标系正好是颠倒的。
所以这时假设我们有个坐标 (100,100) 那么在两个坐标系中的X坐标是相同的 不过Y坐标可能就会差的很远了。 下面看看怎么做能让java的坐标变成PDF的坐标?
Graphics2D g2 = (Graphics2D) g;
g2.translate(400, 400);//为了更方便 把0,0移到400,400
g2.drawLine(0, 0, 500, 0);
g2.drawLine(0, 0, 0, 300);
此时这条线的y方向是向下的(因为java的y轴正方向是向下为证的)
AffineTransform pdftransformation = new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
AffineTransform pdftransformation = new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
AffineTransform javatransformation = new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
pdftransformation.concatenate(javatransformation);
g2.transform(pdftransformation);
上面的几句话就很难解释了 。
用代数式写可以写成 x' =x ,y'=-y
g2.drawLine(100, 100, 500, 100);
g2.drawLine(100, 100, 100, 300);
在画线的时候 这次Y轴就向上了 因为此时每向draw方法里传值 其Y坐标都会变成-y 然后再以java坐标系绘出 。 也就是说所有的点Y坐标都需要变化一次(这里是成负数)再以java坐标系画出。
直接的理解就是 在这时 ,传正值给draw方法 y如果是正数 就向上了。
有关
AffineTransform pdftransformation = new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
AffineTransform javatransformation = new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
pdftransformation.concatenate(javatransformation);