找回密码
 立即注册

QQ登录

只需一步,快速开始

Richard.Huang SpreadJS 开发认证

超级版主

40

主题

3180

帖子

4854

积分

超级版主

Rank: 8Rank: 8

积分
4854

SpreadJS 认证SpreadJS 高级认证

Richard.Huang SpreadJS 开发认证
超级版主   /  发表于:2024-5-27 15:23  /   查看:179  /  回复:0
背景
即上一篇GcExcel导出OFD方案(一)发布后,想必大家对于OFD文档有了一个清晰的认识,知道了OFD文档的本质,以及他底层的一个结构,那么接下来需要做的就是把大象装进冰箱即可。

大象,在咱们的实际生产环境中,就是一个xlsx文件,而将大象装入冰箱,我们马上能想到的就是把大象拆了,一块一块放入冰箱。这意味着,我们需要对一个xlsx文件进行分析,解析这个文件中静态的表格边框,这个文件中的图片资源,这个文件中不同的文字和字体。同时这些资源堆叠的顺序都一一读取出来解析并按照OFD文件的范式去进行罗列。这其中但凡有一个资源放置不准确,在page上定位出现偏差,那么整个导出的OFD文件都会存在不和谐的情况。且因为每一个资源都是独立的,这意味着,文字内容和底下的单元格边框之间我们需要自己去计算他们相互的关系。

那么有没有一个相对简单的方法呢?让咱们GcExcel把这个大象打包好,打包的刚好和这个冰箱一样的大小尺寸,这样我们要做的就是把这个大象塞进去就行了嘛?有吗?有的,那就是pdf,我们用GcExcel把文件转换成pdf,然后再借助ofdrw来将这个pdf转换成OFD就行了嘛

pdf也是一个图层的结构,这个图层和咱们OFD的图层是一个概念,我们可以通过pdfbox去读取内容中的每个图层,然后将这些图层按照比例位置放置在OFD文件画布上即可。这里我们需要借助pfdbox的PDFGraphicsStreamEngine这个类方法去解析pdf文件,通过重写这个方法来达到一个图层资源转移的目的。

PDFGraphicsStreamEngine
这是一个处理PDF图形内容流的Java类,它继承自 `PDFStreamEngine` 类。该类的作用是处理和解释PDF内容流中的图形操作。我们将详细分析这个类及其底层原理。

类的目的

PDFGraphicsStreamEngine类旨在通过添加特定的图形和文本操作符来解析和执行PDF页中的图形内容流。这个类是 `PDFStreamEngine` 的子类,它不仅处理基本的内容流操作,还提供了对图形操作的扩展支持。

核心成员变量
  • private final PDPage page:保存当前操作的PDF页面实例。可能为null,例如,如果内容流是一个平铺模式(tiling pattern)。


构造函数:
  • PDFGraphicsStreamEngine(PDPage page):初始化page变量,并增加各种PDF内容操作符。这些操作符处理图形状态、路径构建、着色、文本状态等。


主要方法:
  • getPage(): 返回当前的PDF页面。
  • appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3): 将矩形追加到当前路径。
  • drawImage(PDImage pdImage): 绘制图像。
  • clip(int windingRule): 按给定的卷绕规则裁剪当前路径。
  • moveTo(float x, float y): 从当前点移动到指定位置 (x, y)。
  • lineTo(float x, float y): 从当前点绘制一条直线到 (x, y)。
  • curveTo(float x1, float y1, float x2, float y2, float x3, float y3): 绘制贝塞尔曲线。
  • getCurrentPoint(): 返回当前路径的当前点。
  • closePath(): 关闭当前路径。
  • endPath(): 结束当前路径而不填充或描边。
  • strokePath(): 描边路径
  • fillPath(int windingRule): 按给定的卷绕规则填充路径。
  • fillAndStrokePath(int windingRule): 按给定的卷绕规则填充并描边路径。
  • shadingFill(COSName shadingName): 使用给定的着色字典名称填充。


底层原理:
这些内容流操作符是直接解析PDF内容流字节码(通常存储在.pdf文件中),并将其转换为图形命令。这种转换由一系列的操作符类实现,每个操作符类对应于PDF中的一个图形或文本命令,如LineTo、MoveTo、FillPath等。

操作符将这些命令传递给适当的方法,并通过方法内部实现细节与底层图形系统(如Java 2D或其他绘图库)交互,以实际绘制PDF内容。例如,lineTo(float x, float y)最终会调用底层绘图操作,将一条线绘制到屏幕上或渲染到图像缓冲区。

使用说明:
这个类本身是抽象的,意味着它不能直接被实例化。用户需要创建一个子类并实现所有抽象方法,以定义具体的图形操作行为。这使得PDFGraphicsStreamEngine成为一个高度灵活和可扩展的框架,适用于多种PDF处理需求。

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部