14.5.1将内容绘制到PdfGraphics2D_[ITEXT IN ACTION]

这篇博客讲述了如何将Swing中的Graphics2D图形绘制到PDF文件中,特别强调了PdfGraphics2D类的作用。通过示例代码展示了如何将使用Graphics2D的对象转换为PDF,以及在使用PdfGraphics2D时应注意的坐标系、颜色空间和字体差异。并提供了避免常见问题的提示。
摘要由CSDN通过智能技术生成

Swing是一个为Java程序提供GUI的API。它由不同的GUI组件和一系列图形类组成,包括一个名为Graphics2D的抽象类。 PdfContentByte有一系列createGraphics()方法,允许您创建一个名为PdfGraphics2D的类的特殊实现。该子类覆盖所有Graphics2D方法,将它们转换为前面部分中描述的PdfContentByte调用。

使用Swing 对象绘制图形

Java API表示java.awt.Graphics是“所有图形控制文件的抽象基类,允许应用程序绘制到在各种设备上实现的组件,以及屏幕外图像。”抽象类java.awt.Graphics2D扩展了Graphics类“以提供对几何,坐标转换,颜色管理和文本布局的更复杂的控制。这是在Java平台上渲染二维形状,文本和图像的基础类。“

Oracle的Sun Developer Network(SDN),提供了一个教程:“从几何图元中构造复杂的形状。”在此教程中有一个名为Pear.java的例子,用于绘制一个如图14.7所示的形状。

图14.7右侧的窗口是一个包含JPanel的JFrame。使用下一段代码构建和绘制JPanel。此代码段几乎与可在SDN上找到的示例相同。

在这里插入图片描述

Listing 14.11 PearExample.java

public class PearExample extends JPanel {
     Ellipse2D.Double circle, oval, leaf, stem;                             
     Area circ, ov, leaf1, leaf2, st1, st2;          
     public PearExample() {                                                 
       circle = new Ellipse2D.Double();                                     
       oval = new Ellipse2D.Double();                                       
       leaf = new Ellipse2D.Double();                                       
       stem = new Ellipse2D.Double();                                       
       circ = new Area(circle);                                             
       ov = new Area(oval);                                                 
       leaf1 = new Area(leaf);                                              
       leaf2 = new Area(leaf);                                              
       st1 = new Area(stem);                                                
       st2 = new Area(stem);                                                
     }                                                                      
     public void paint(Graphics g) {
       Graphics2D g2 = (Graphics2D)g;
       double ew = 75; double eh = 75;
       g2.setColor(Color.GREEN);                                            
       leaf.setFrame(ew - 16, eh - 29, 15.0, 15.0);        
       leaf1 = new Area(leaf);                                              
       leaf.setFrame(ew - 14, eh - 47, 30.0, 30.0);                         
       leaf2 = new Area(leaf);                                              
       leaf1.intersect(leaf2);                                              
       g2.fill(leaf1);                                                      
       leaf.setFrame(ew + 1, eh - 29, 15.0, 15.0);                          
       leaf1 = new Area(leaf);                                              
       leaf2.intersect(leaf1);                                              
       g2.fill(leaf2);                                                      
       g2.setColor(Color.BLACK);                  
       stem.setFrame(ew, eh - 42, 40.0, 40.0);           
       st1 = new Area(stem);                      
       stem.setFrame(ew + 3, eh - 47, 50.0, 50.0);
       st2 = new Area(stem);                      
       st1.subtract(st2);                         
       g2.fill(st1);                              
       g2.setColor(Color.YELLOW);                  
       circle.setFrame(ew - 25, eh, 50.0, 50.0);           
       oval.setFrame(ew - 19, eh - 20, 40.0, 70.0);
       circ = new Area(circle);                    
       ov = new Area(oval);                        
       circ.add(ov);                               
       g2.fill(circ);                              
     } 
}

这是一本关于PDF的书,不是关于Java的书,所以我们不会详细讨论不同的几何原语以及如何使用它们。 这一切都在SDN上进行了解释。 相反,我们将尝试将这个复杂的形状绘制为PDF,如窗口所示
在图14.7中。

使用PDFGRAPHICS2D 绘制图形

在清单14.12中,您将重用清单14.11中的代码。 您将构建一个JPanel,更具体地说是PearExample对象,创建一个PdfGraphics2D实例,并使用paint()方法将JPanel绘制到PdfGraphics2D。 不要忘记使用dispose()方法B,否则最终会在生成的PDF文件中出现不可预测的错误。

Listing 14.12 PearToPdf.java

Document document = new Document(new Rectangle(150, 150)); 
PdfWriter writer
  = PdfWriter.getInstance(document, new FileOutputStream(filename)); 
document.open();
PdfContentByte canvas = writer.getDirectContent();
PearExample pear = new PearExample();                               
Graphics2D g2 = canvas. createGraphics(150, 150); 
pear.paint(g2);                                                     
g2.dispose();                                     
document.close();

可以看到PearExample构造函数中没有一行引用iText,也没有引用paint()方法。 这是一个非常强大的功能。 如果你有一个使用Graphics2D对象绘制形状到的现有应用程序,则可以使用此代码段将这些形状添加到PDF文件中。 图14.8显示了如何通过PdfGraphics2D机制将使用JFreeChart库生成的图表集成到PDF文件中。

在这里插入图片描述

图14.8中的饼图是使用下一个代码片段创建的。 它绘制了数据库查询的结果,该数据库查询选择了九个导演以及这些导演在电影数据库中的电影数量。

Listing 14.13 DirectorCharts.java

public static JFreeChart getPieChart()
  throws SQLException, IOException {
  DatabaseConnection connection                
    = new HsqldbConnection("filmfestival");            
  Statement stm = connection.createStatement();
  ResultSet rs = stm.executeQuery(QUERY1);     
  DefaultPieDataset dataset = new DefaultPieDataset();
  Director director;                                         
  while (rs.next()) {                                 
    director = PojoFactory.getDirector(rs);           
    dataset.setValue(String.format("%s, %s",          
      director.getName(), director.getGivenName()),   
      rs.getInt("c"));                                
  }                                                   
  connection.close();
  return ChartFactory.createPieChart(                 
    "Movies / directors", dataset, true, true, false);     
}

同样,这个方法也不用使用iText改写。 iText魔术发生在这里:

Listing 14.14 DirectorCharts.java (continued)

PdfContentByte cb = writer.getDirectContent(); 
float width = PageSize.A4.getWidth(); 
float height = PageSize.A4.getHeight() / 2;
PdfTemplate pie = cb.createTemplate(width, height);      
Graphics2D g2d1 = pie.createGraphics(             
  width, height, new DefaultFontMapper());            
Rectangle2D r2d1
  = new Rectangle2D.Double(0, 0, width, height); 
getPieChart().draw(g2d1, r2d1);                   
g2d1.dispose(); 
cb.addTemplate(pie, 0, height);   

这个代码段使用PdfTemplate获取PdfGraphics2D对象。 用这个PdfGraphics2D对象轻松绘制图表。

PDFGRAPHICS2D应用故障排除

到目前为止,与本章前面的示例相比,Graphics2D示例非常简单。 如果跑起来没有任何问题,那你真是牛逼大发了。 许多开发人员在此过程中碰到的问题,可以通过遵循以下指引来避免:

■ 完成绘制到PdfGraphics2D对象后,不要忘记调用dispose()方法(清单14.12中的g2.dispose(); )。

■ Java的Graphics2D中的坐标系与PDF的图形中的默认坐标系不同。 Java Graphics中的原点是绘图区域的左上角。 X坐标向右增加; Y坐标向下增加。

■ Java使用标准的Red-Green-Blue(sRGB)中作为内部的默认颜色空间,但是颜色需要转换。 注意,具有四种颜色值的任何内容都被假定为ARGB,即使它可能是CMYK。 (ARGB包括RGB组件加上alpha透明度因子,用于指定将一种颜色绘制在另一种颜色上时会发生什么。)

■ 注意使用字体时。 java.awt.Font和com.itextpdf.text.Font字体类之间存在很大差异。 我们将在第14.5.2节讨论这个问题。

在下一节中,我们将介绍如何使用Graphics2D渲染文本。

目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 1.3.1依赖注入 1.3.2di应用 1.3.3企业级应用中的依赖注入 1.4应用aop 1.4.1aop介绍 1.4.2aop使用 1.5小结 第2章基本bean装配 2.1容纳你的bean 2.1.1beanfactory介绍 2.1.2使用应用上下文 2.1.3bean的生命 2.2创建bean 2.2.1声明一个简单的bean 2.2.2通过构造函数注入 2.3注入bean属性 2.3.1注入简单的数值 2.3.2使用其他的bean 2.3.3装配集合 2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本的方法替换 3.2.2获取器注入 3.3注入非springbean 3.4注册自定义属性编辑器 3.5使用spring的特殊bean 3.5.1后处理bean 3.5.2bean工厂的后处理 3.5.3配置属性的外在化 3.5.4提取文本消息 3.5.5程序事件的解耦 3.5.6让bean了解容器 3.6脚本化的bean 3.6.1给椰子上lime 3.6.2脚本化bean 3.6.3注入脚本化bean的属性 3.6.4刷新脚本化bean 3.6.5编写内嵌的脚本化bean 3.7小结 第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的pojo切面 4.5注入aspectj切面 4.6小结 第二部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的异常体系 5.1.2数据访问的模板化 5.1.3使用dao支持类 5.2配置数据源 5.2.1使用jndi数据源 5.2.2使用数据源连接池 5.2.3基于jdbc驱动的数据源 5.3在spring里使用jdbc 5.3.1处理失控的jdbc代码 5.3.2使用jdbc模板 5.3.3使用spring对jdbc的dao支持类 5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5spring和java持久api 5.5.1使用jpa模板 5.5.2创建一个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7缓存 5.7.1配置缓存方案 5.7.2缓存的代理bean 5.7.3注解驱动的缓存 5.8小结 第6章事务管理 6.1理解事务 6.1.1仅用4个词解释事务 6.1.2理解spring对事务管理的支持 6.2选择事务管理器 6.2.1jdbc事务 6.2.2hibernate事务 6.2.3jpa事务 6.2.4jdo事务 6.2.5jta事务 6.3在spring中编写事务 6.4声明式事务 6.4.1定义事务参数 6.4.2代理事务 6.4.3在spring2.0里声明事务 6.4.4定义注释驱动事务 6.5小结 第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2根据数据库验证身份 7.2.3根据ldap仓库进行身份验证 7.3控制访问 7.3.1访问决策投票 7.3.2决定如何投票 7.3.3处理投票弃权 7.4保护web应用程序 7.4.1代理springsecurity的过滤器 7.4.2处理安全上下文 7.4.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值