IT教程 ·

运用C#开发pdf阅读器初探(基于WPF,没有运用开源库)

Spring-cloud微服务实战【十】:消息总线Bus

媒介 pdf是最盛行的版式花样文件规范,已成为国际规范。pdf相干的开源软件异常多,也基础能满足一样平常需要了。相干商业软件更是各种各样,险些无奇不有!好像没必要本身再独立自立开发!但,本人基于以下斟酌,决议自立研发一款pdf阅读器。

  1)经由过程编写pdf阅读器,能够敏捷的熟习pdf文件的处置惩罚。pdf花样包括的内容异常多,仅仅经由过程查资料,很难掌握其内容。

  2)任何手艺,只要自立可控,才抵达气定神闲!应用开源软件是简朴,万一遇到问题,就是个坑!

  3)处理pdf与ofd互转问题。ofd是国家规范,相干的处置惩罚软件异常少。为了处理两种花样文件互转,必需相识pdf。

  4)本人此前开发了一款ofd阅读器,积累了一些履历。为开发pdf阅读器增添了自信心。

迥殊申明 本人花了几周写了这款阅读器,考证了pdf差别范例的数据处置惩罚,还远远到不了商用的请求。不积跬步无以致千里!本人会逐渐完美这款软件,敬请期待。本人的参考资料有两本英文书本和pdf英文规范文档。

程序界面:

运用C#开发pdf阅读器初探(基于WPF,没有运用开源库) IT教程 第1张

pdf相干参考资料:

运用C#开发pdf阅读器初探(基于WPF,没有运用开源库) IT教程 第2张

运用C#开发pdf阅读器初探(基于WPF,没有运用开源库) IT教程 第3张

运用C#开发pdf阅读器初探(基于WPF,没有运用开源库) IT教程 第4张

pdf文件构造简介 

pdf总的内容构造以下:

运用C#开发pdf阅读器初探(基于WPF,没有运用开源库) IT教程 第5张

 1)header: 有关pdf版本信息。最新版为 %PDF−1. 7

 2)Body:存储详细数据,pdf就是由许多object构成的。每一个object由dictionary和stream构成。dictionary存储就是key、value字符对。dictionary是能够嵌套的,就是value有大概也是一个dictionary。

 3)Cross-Reference Table:交织索引表。能够疾速定位到详细object。便于随机读取object。

 4)Trailer:给出交织索引表的位置。读取pdf文件都是从末了入手下手读的,所以Trailer肯定是在文件末了。

 pdf处置惩罚整体构造

运用C#开发pdf阅读器初探(基于WPF,没有运用开源库) IT教程 第6张

 object内容读取

  交织索引表能疾速定位到某个object的位置,读取object内容不难,症结是剖析dictionary。dictionary是能够嵌套,就是dictionary的内容另有dictionary。疾速解析出一切的dictionary是处置惩罚的症结。典范的dictionary构造以下:

<<
/Annots 68 0 R /BleedBox [0 0 504 661.5] /Contents [51 0 R] /CropBox [0 0 504 661.5] /MediaBox [0 0 504 661.5] /Parent 4334 0 R /Resources << //嵌套dictionary
/ColorSpace <</CS1 62 0 R>>  //2次嵌套dictionary
/Font <</F1 7 0 R/F2 11 0 R/F3 13 0 R/F4 53 0 R>> //2次嵌套dictionary
/ProcSet [/PDF/Text/ImageB/ImageC] //数组
/XObject <</I1 54 0 R/I2 56 0 R/I3 60 0 R>>//2次嵌套dictionary
>>

/Type /Page >>

页面内容剖析

  页面内容由系列操纵数和操纵符构成。一切的操纵数和操纵符在同一个文本中,所以要疾速的将操纵数和操纵符构成能够实行的操刁难。

0 0 515.95 728.6 re
W* n
0 w
2 M
2 J
2 j
0 0 0 RG
BT
0 0 0 rg
/FT8 180 Tf
/GS13 gs
0.05 0 0 -0.05 187.68 676.49 Tm
<35BE>Tj 180 0 TD<1D5F>Tj 180 0 TD<4205>Tj 180 0 TD<4EC8>Tj
ET

  字符都是存在()或<>中,撤除字符和数字,就是操纵符。如上文W*、n都是操纵符;<35BE>为16进制字符对应的key,详细代表哪个字,需要到查字符表。这里的35BE并不是unicode字符对应的值,还需要再查表。以下图:

beginbfchar
<0019> <0036>
<35BE> <0037>
<001B> <0038>
<001C> <0039>
endbfchar

  <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设想原则这些并不难明白,然则要到达应用自若还需要重复磨炼。把握好每一个细节,准确应用设想原则,一步一个脚印,终究会将不大概变成大概!

Jprofile解析dump文件使用详解

参与评论