1.调用getDocument
在viewer.js中通过getDocument获取到PDf文档后,返回了文档数据pdfDocument!
2.调用了self.load
然后调用了self.load(pdfDocument, scale);方法,在方法的内部又调用了pdfViewer.setDocument(pdfDocument);方法
3.setDocument
在setDocument方法内部,通过调用getPage方法获取到了pdf文档的页面
大致过程如下
-
进过在pdf.js内部的一些操作后,通过postmessage发送给pdf.worker.js一个对象
-
这时候就会调用pdf.worker.js PDFDocument构造函数的getpage方法
-
同时PDFDocument的方法有会去调用catalog构造函数的getpage方法,调用page构造函数,随后会返回一个实例化之后的page对象。调用page构造函数的参数从哪来的呢:
1.在pdfManager函数内部传入的pdfManager和xref
pdfManager是通过接口调取返回的一个xhr对象转buffer后在LocalPdfManager构造函数中生成的
xref这个数据是在PDFDocument构造函数中使用xref构造函数实例化的
2.pageIndex是构造函数内部的getPageIndex生成的,是PDF页码索引
3.dict, ref是将pageIndex传入了内部的getPageDict方法生成的
4.fontCache是RefSetCache构造函数的实例化对象
4.pdf.worker.js page构造函数
-
内部的annotations方法调用了Annotation构造函数的fromRef方法,把xref对象和内部的annotationRefs方法生成的ref对象作为参数`
-
调用了xref对象内部的fetchIfRef方法,用ref做为参数,返回一个dict对象
-
把dict对象传给Util.getInheritableProperty返回一个Sig的字符串,以此调用WidgetAnnotation
-
进入WidgetAnnotation构造函数内,直接看最后的Util.inherit部分,把WidgetAnnotation构造函数本身和Annotation构造函数和最后一个变量传输过去
-
最后一个变量会返回一个 { isViewable :function WidgetAnnotation_isViewable },函数内部判断在page方法中调用时传的fieldtype是不是Sig,如果是返回false,不是就调用parent.isViewable.call(this),然后又进入到了Annotation构造函数的fromRef方法
-
这时候会进行判断会调用函数,如果注释掉之前的sig的判断,这时候返回值为true,同时就会触发return annotation
最后return了一个数组,数组里的内容就是annotation,同时调用shadow方法给page构造函数绑定了一个属性annotations,属性值为annotation数组。
5.handler的getpage事件
以上操作完成后会执行handler对象的getpage方法,返回数据发送给pdf.js
6.PDF.js的WorkerTransport
PDF.js接收信息后调用WorkerTransport构造函数的getpage方法,返回了一个promise,然后通过执行一些方法后重新把数据发送给viewer.js
7.执行绘制方法
viewer.js获取getpage方法返回的数据后,就调用了PDFPageView.draw方法,最后通过this.pdfPage.render();方法完成绘制过程