这一章将详细分析一下pdf_init_document(fz_context *ctx, pdf_document *doc)接口的内部调用逻辑。此接口主要实现文档初始化并加载交叉引用表的功能。
1,解析文档版本 范围:1.0-1.7 ,pdf_load_version(ctx, doc);//操作文件流,读取首行解析文档版本
2,如果线性文件标志为真,加载线性文件, pdf_load_linear(ctx, doc);后续章节会详细介绍线性文件过程。
3,判断是否是线性文件,pdf_check_linear(ctx, doc);//获取线性化参数字典,判断Linearized标志
4,加载交叉引用表,pdf_load_xref(ctx, doc, &doc->lexbuf.base);
4.1)查找最后一个交叉引用表的位置 pdf_read_start_xref(ctx, doc);//操作文件指针找到“startxref”处
4.2)获取所有交叉引用表的位置,保存在int64数组内 pdf_read_xref_sections(ctx, doc, doc->startxref, buf, 1);
4.2.1)交叉引用表结构初始化 pdf_populate_next_xref_level(ctx, doc);//创建xref结构,默认初始化
4.2.2)交叉引用表与尾注关联,返回上一个交叉引用表的位置 ofs = read_xref_section(ctx, doc, ofs, buf);//获取尾注字典,与交叉引用表关联,返回上一个交叉引用表的位置
4.3)xref index数组 赋值 pdf_prime_xref_index(ctx, doc);//遍历所有所有交叉引用表,将n类型条目存入xref_index数组
4.4)交叉引用表第i个条目 初步判断type entry = pdf_get_xref_entry(ctx, doc, i);
5,判断文件是否需要修复,若需要 pdf_repair_xref(ctx, doc);//修复完成后调用pdf_prime_xref_index(ctx, doc);//更新xref_index数组
6,密钥认证 pdf_authenticate_password(ctx, doc, "");
7,读取ocg信息 pdf_read_ocg(ctx, doc);