使用 C# 开发 Pdf 阅读器初探(基于 WPF,没有使用开源库)
Abstract Keywords Pdf Wpf Pdf Wpf
Citation Yao Qing-sheng.使用 C# 开发 Pdf 阅读器初探(基于 WPF,没有使用开源库).FUTURE & CIVILIZATION Natural/Social Philosophy & Infomation Sciences,20240808. https://yaoqs.github.io/20240808/shi-yong-c-kai-fa-pdf-yue-du-qi-chu-tan-ji-yu-wpf-mei-you-shi-yong-kai-yuan-ku/
转载自 使用 C# 开发 pdf 阅读器初探(基于 WPF,没有使用开源库)
¶ 前言
pdf 是最流行的版式格式文件标准,已成为国际标准。pdf 相关的开源软件非常多,也基本能满足日常需要了。相关商业软件更是林林总总,几乎应有尽有!似乎没必要自己再独立自主开发!但,本人基于以下考虑,决定自主研发一款 pdf 阅读器。
- 通过编写 pdf 阅读器,可以迅速的熟悉 pdf 文件的处理。pdf 格式包含的内容非常多,仅仅通过查资料,很难掌握其内容。
- 任何技术,只有自主可控,才能到达气定神闲!使用开源软件是简单,万一遇到问题,就是个坑!
- 解决 pdf 与 ofd 互转问题。ofd 是国家标准,相关的处理软件非常少。为了解决两种格式文件互转,必须了解 pdf。
- 本人此前开发了一款 ofd 阅读器,积累了一些经验。为开发 pdf 阅读器增添了信心。
特别说明 本人花了几周写了这款阅读器,验证了 pdf 不同类型的数据处理,还远远到不了商用的要求。不积跬步无以至千里!本人会慢慢完善这款软件,敬请期待。本人的参考资料有两本英文书籍和 pdf 英文标准文档。
程序界面: 点击下载程序
¶pdf 相关参考资料:
¶pdf 文件结构简介
pdf 总的内容结构如下:
- header: 有关 pdf 版本信息。最新版为 % PDF−1. 7
- Body:存储具体数据,pdf 就是由很多 object 组成的。每个 object 由 dictionary 和 stream 组成。dictionary 存储就是 key、alue 字符对。dictionary 是可以嵌套的,就是 value 有可能也是一个 dictionary。
- Cross-Reference Table:交叉索引表。可以快速定位到具体 object。便于随机读取 object。
- Trailer:给出交叉索引表的位置。读取 pdf 文件都是从最后开始读的,所以 Trailer 一定是在文件最后。
¶pdf 处理总体结构
¶object 内容读取
交叉索引表能快速定位到某个 object 的位置,读取 object 内容不难,关键是分析 dictionary。dictionary 是可以嵌套,就是 dictionary 的内容还有 dictionary。快速解析出所有的 dictionary 是处理的关键。典型的 dictionary 结构如下:
1 | << |
¶ 页面内容分析
页面内容由系列操作数和操作符组成。所有的操作数和操作符在同一个文本中,所以要快速的将操作数和操作符组成可以执行的操作对。
1 | 0 0 515.95 728.6 re |
字符都是存在()或 <> 中,除去字符和数字,就是操作符。如上文 W*、n 都是操作符;<35BE> 为 16 进制字符对应的 key,具体代表哪个字,需要到查字符表。这里的 35BE 并不是 unicode 字符对应的值,还需要再查表。如下图:
1 | beginbfchar |
<35BE> 对应的是 < 0037>。该表存在字体资源文件 object 中。
¶ 页面显示
¶ 坐标系变换
理清不同坐标系之间的关系是处理的关键。坐标系分为:Device Space(设备坐标空间)、User Space(设备坐标空间)、text space(文本坐标空间)等。
¶ 绘画上下文设置
当前绘画的状态(画笔、画刷等)是保存在栈中,会有入栈出栈操作。
¶ 特殊画刷处理
pdf 有一种画刷,比如渐变色,这个很难找到现成的画刷使用。我使用的是 ImageBrush,就是使用图片作为画刷。在内存中创建可擦写的图片,可以精确控制每个像素的值。根据 pdf 标准提供的算法,计算每个像素的值。
pdf 的显示大体分为三种:曲线、文本、图片。其中曲线的显示是比较麻烦的,关键是将 pdf 标准的描述与 wpf 曲线操作对应起来。
¶pdf 阅读器开发说明
如果完全参数标准文件开发,是比较枯燥,感觉慢慢长路看不到尽头。我采用是单个功能各个击破的方法,能很快见到开发成果。我使用的参考书是《PDF Explained》,100 多页,只是对 pdf 做大体介绍,但是各个功能点都有所提及。我就参照该书提供的示例文件,逐步验证每个文件。
每种显示都有多种处理方法,每个软件生成 pdf 的风格是不同的。对特定的软件生成的 pdf 做几次验证后,基本可以保证该软件生成的 pdf 都可以正常显示。
wps 是可以直接将 doc 文件转换为 pdf 的。我对 wps 生成的 pdf 做了测试,经过几次调试,现在基本可以正常处理 wps 生成的 pdf 文件。
¶ 后记
对于开发 pdf 阅读器这类软件,以前都是不敢想象的。像这种复杂的软件,必须遵循一定的设计模式、正确建立域模型。所以开发这类软件,对 pdf 标准的理解是否深刻并非关键,关键还是编程的功底。软件的外在表现千奇百态,但内在逻辑具有类比性的。继承、封装、多态、SOLID 设计准则这些并不难理解,但是要达到应用自如还需要反复锤炼。把握好每个细节,正确运用设计准则,一步一个脚印,最终会将不可能变成可能!
¶ 相关阅读
Address:Department of Natural/Social Philosophy & Infomation Sciences, CHINA
Biography...
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!
Like this article? Support the author with