恢复Shift+Right click运行命令行菜单

  1. Ctrl+R键打开运行对话框;
  2. 输入regedit命令运行注册表编辑器;
  3. 找到HKEY_CLASSES_ROOT\Directory\Background\shell\cmd项;
  4. 鼠标右键单击cmd键,点击选择 权限 项;
  5. 在弹出的对话框中点击 高级 按钮;
  6. 点击 更改
  7. 输入用户名(例如:Administrator),然后点击 检查名称 按钮,再点击 确定 按钮关闭对话框;
  8. 勾选 替换子容器和对象的所有者 ,点击 应用 按钮,再点击 确定 按钮关闭对话框;
  9. 鼠标右键单击cmd键,点击选择 权限 项,选择Administrators账户,勾选所有控制权限选项,点击 应用 按钮,再点击 确定 按钮关闭对话框;
  10. 鼠标左键点击cmd键,查看右边窗口有没有HideBasedOnVelocityId键,如果有,就删除掉;
  11. 鼠标右键单击cmd键,点击选择 新建 -> DWORD(32位)值,名称:ShowBasedOnVelocityId,数据:639bc8(十六进制);
  12. 说明:以上修改是修改目录内背景处使用Shift+鼠标右键方式弹出菜单;如果需要修改在目录名上使用Shift+鼠标右键方式弹出菜单,按以上方法修改HKEY_CLASSES_ROOT\Directory\shell\cmd项即可。

pdfium内核编译

  1. 运行如下命令配置git
    $ git config --global user.name "My Name"
    $ git config --global user.email "my-name@gmail.com"
    $ git config --global core.autocrlf false
    $ git config --global core.filemode false
    $ git config --global branch.autosetuprebase always
    
  2. 安装depot_tools工具并将解压后depot_tools的路径添加到path环境变量;
  3. 运行如下命令获取代码:
    mkdir repo
    cd repo
    gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git
    gclient sync
    cd pdfium
    
  4. 运行脚本:./build/install-build-deps.sh
  5. 添加如下环境变量:
    • DEPOT_TOOLS_WIN_TOOLCHAIN=0
    • GYP_GENERATORS=msvs/ninja
    • GYP_MSVS_VERSION=2019
  6. 运行命令:gn gen out/Debug生成项目文件(用于ninja编译)(可能需要安装Windows 10 SDK,按照出错后提示的版本号安装,including the “Debugging Tools for Windows” feature);
  7. 运行命令:ninja -C out/Debug编译项目(根据第二步);
  8. 运行命令:gn gen out/vs2019/Debug --ide="vs2019"生成用于Visual studio 2019的项目文件;
  9. 运行命令:msbuild out/Debug/vs2019/Debug/all.sln /m编译项目(根据第四步);

vs 调试Action语法

  • $ADDRESS 当前函数和地址,输出如lindexi.Foo.F1()+0x7d3abc3800000025c
  • $CALLER 调用这个方法的方法名,输出如lindexi.Foo.F2当前我进入F1方法是在F2使用的
  • $CALLSTACK 将会显示调用堆栈,将会从程序的入口到当前方法的调用堆栈一个个显示
  • $FUNCTION 当前调用的方法,输出入lindexi.Foo.F1()这个方法会比输出当前函数和地址常用
  • $PID 当前进程号
  • $TID 当前线程号
  • $TNAME 当前线程名
  • $TICK 系统从开启到现在的毫秒数

git 常用操作

  1. 不应用一个stash查看stash的修改:
    • 查看最近一条stash记录:git stash show -p
    • 查看任意一条stash记录:git stash show -p stash@{n}
    • 根据任意一条stash记录生成patch文件:git stash show -p stash@{n} > file.patch
    • 删除一条stash记录:git stash drop stash@{n}
  2. 根据作者统计提交次数:git shortlog -sn

PDF文件结构

本文介绍如何在PDF文件中组织对象,以进行有效的随机访问和增量更新。规范的PDF文件最初包含四个元素(请参见图1):

  • 单行文件头,标识文件符合的PDF规范的版本
  • 包含构成文件中包含的文档的对象的主题
  • 包含有关文件中间接对象信息的交叉引用表
  • 文件Trailer,提供交叉引用表和文件正文中某些特殊对象的位置

figure1

图1:PDF文件的初始结构

可以通过以后的更新来修改此初始结构,该更新将其它元素附加到文件的末尾。有关详细信息,请参见“增量更新”。

按照惯例,PDF文件中的标记排列成行;每行以行尾(EOL)标记结尾,该标记可以是回车符(ASCII码13),换行符(ASCII码10)或两者同时使用。包含二进制数据的PDF文件可能会任意长行。但是,为了增强与处理PDF文件的其他应用程序的兼容性,不属于流对象数据的行的行数不得超过255个字符,但是有一个例外。从PDF 1.3开始,签名字典的Contents字符串不受行长的限制。

此处描述的规则足以生成格式正确的PDF文件。但是,其它规则适用于组织PDF文件以在网络环境中实现对文档组件的有效增量访问。这种称为线性化PDF的组织形式。

1.文件头

PDF文件的第一行是文件头,用于标识文件所遵循的PDF规范的版本。 对于符合PDF 1.7的文件,文件头应为

%PDF-1.7

但是,由于符合早期版本PDF的任何文件也符合1.7版本,因此处理PDF 1.7的应用程序也可以接受具有以下任何标头的文件:

%PDF-1.0
%PDF-1.1
%PDF-1.2
%PDF-1.3
%PDF-1.4
%PDF-1.5
%PDF-1.6

从PDF 1.4开始,文件标题中的版本可以被文档目录字典中的Version条目覆盖。这使PDF生产者应用程序可以使用增量更新来更新版本。

在某些情况下,消费者应用程序可能能够处理符合其设计要接受的更高版本的PDF文件。新的PDF功能通常以这样一种方式引入,即那些不了解它们的消费者可以安全地忽略它们。

注意:如果PDF文件像大多数情况一样包含二进制数据,建议标题行后紧跟注释行,该注释行至少包含四个二进制字符,也就是说,代码为128或更大的字符。这样可以确保文件传输应用程序的正常行为,该应用程序可以检查文件开头附近的数据,以确定是将文件内容视为文本还是二进制。

2.文件主体

PDF文件的主体由一系列表示文档内容的间接对象组成。它们表示文档的组件,例如字体,页面和采样的图像。从PDF 1.5开始,主体还可以包含对象流,每个对象流都包含一系列间接对象。

3.交叉引用表

交叉引用表包含允许随机访问文件中间接对象的信息,因此无需读取整个文件即可找到任何特定对象。该表包含每个间接对象的单行条目,指定该对象在文件正文中的位置。(从PDF 1.5开始,部分或全部交叉引用信息可以替代地包含在交叉引用流中)

交叉引用表是具有固定格式的PDF文件的唯一部分,它允许随意访问表中的条目。该表包含一个或多个交叉引用部分。最初,整个表格由一个部分组成(如果文件已线性化,则为两个部分)。每次更新文件时,都会添加一个附加部分。

每个交叉引用部分均以包含关键字xref的行开头。此行之后是一个或多个交叉引用小节,这些小节可以按任何顺序出现。子节结构对于增量更新很有用,因为它允许将新的交叉引用节添加到PDF文件中,其中仅包含已添加或删除的对象的条目。对于从未更新过的文件,交叉引用节仅包含一个子节,其对象编号从0开始。

每个交叉引用小节均包含连续范围的对象编号的条目。该子节从包含两个数字的行开始,该数字用空格隔开:该子节中第一个对象的对象号和该子节中的条目数。例如,行

28 5

引入一个小节,其中包含五个从28到32连续编号的对象。

注意:给定的对象编号不能在一个节中的多个子节中具有条目。

此行之后是交叉引用条目本身,每行一个。每个条目正好20字节长,包括行尾标记。交叉引用条目有两种:一种用于使用中的对象,另一种用于已删除并因此可用的对象。两种类型的条目都有相似的基本格式,以关键字n(对于正在使用的条目)或f(对于空闲条目)来区分。使用中条目的格式为

nnnnnnnnnn ggggg n eol

其中

nnnnnnnnnn是10位字节的偏移量
ggggg是5位数的生成编号
n是文字关键字,将其标识为正在使用的条目
eol是2个字符的行尾序列

字节偏移量是一个10位数字,必要时用前导零填充,给出从文件开头到对象开头的字节数。它与生成编号之间用一个空格隔开。生成编号是一个5位数字,必要时还用前导零填充。在生成编号之后是一个空格,关键字n和一个2个字符的行尾序列。如果文件的行尾标记是单个字符(回车符或换行符),则其前面应有一个空格;如果标记是2个字符(回车符和换行符),则其前面不能有空格。因此,条目的总长度总是正好为20个字节。

空闲对象的交叉引用条目具有基本相同的格式,除了关键字是f而不是n且第一项的解释不同之外:

nnnnnnnnnn ggggg f eol

其中

nnnnnnnnnn是下一个空闲对象的10位数字对象编号
ggggg是5位数的生成编号
f是文字关键字,将其标识为空闲条目
eol是2个字符的行尾序列

交叉引用表中的空闲条目形成一个链表,每个空闲条目都包含下一个的对象编号。该表中的第一个条目(对象编号0)始终是空闲的,并且生成编号为65,535;它是空闲对象的链表的头节点。最后一个空闲条目(链表的尾节点)链接回对象编号0。(此外,表可能包含其他空闲条目,这些链接链接回到对象编号0,并且生成编号为65,535,即使这些条目是不在链表中。)

除对象编号0外,交叉引用表中的所有对象最初的生成编号为0。删除间接对象时,其交叉引用条目被标记为空闲,并将其添加到空闲条目的链表中。条目的生成编号加1,以表示下次创建具有该对象号的对象时要使用的生成编号。因此,每次重新使用该条目时,都会为其指定一个新的生成编号。最大生成数为65,535;当交叉引用条目达到此值时,将不会再重用它。

交叉引用表(包括原始交叉引用节和所有更新节)必须为文件中从0到使用的最大对象号之间的每个对象号包含一个条目,即使该范围内的一个或多个对象号实际上在文件中没有出现。

示例1显示了一个由一个带有六个条目的小节组成的交叉引用节:四个正在使用(对象1、2、4和5)和两个空闲(对象0和3)。对象编号3已删除,使用该对象编号创建的下一个对象的生成编号为7。

示例1

xref
0 6
0000000003 65535 f
0000000017 00000 n
0000000081 00000 n
0000000000 00007 f
0000000331 00000 n
0000000409 00000 n

示例2显示了一个具有四个子节的交叉引用节,总共包含五个条目。第一部分包含一个条目,对象号为0,是空闲的。第二小节包含一个使用中的对象编号为3的条目。第三小节包含两个条目,分别是对象23和24,这两个条目都在使用中。从对象编号23的生成编号2可以看出,对象编号23已被重用。对象的对象编号30的第四小节包含一个条目,该条目正在使用中。

示例2

xref
0 1
0000000000 65535 f
3 1
0000025325 00000 n
23 2
0000025518 00002 n
0000025635 00000 n
30 1
0000025777 00000 n

4.文件Trailer

PDF文件的trailer使读取文件的应用程序可以快速找到交叉引用表和某些特殊对象。应用程序应从其末尾读取PDF文件。

文件的最后一行仅包含文件结尾标记%%EOF。前两行包含关键字startxref和最后一个交叉引用部分中从文件开头到xref关键字开头的字节偏移。startxref行之前是trailer字典,该字典由关键字trailer组成,后跟一系列用双尖括号(<<…>>)括起来的键/值对。因此,trailer具有以下总体结构:

trailer
  <<
    key1 value1
    key2 value2
    …
    keyn valuen
  >>
startxref
Byte_offset_of_last_cross-reference_section
%%EOF

表1列出了Trailer字典的内容。

表1 文件Trailer字典的内容
类型
Size integer (必需;不得为间接引用)文件的交叉引用表中的条目总数,由原始部分和所有更新部分的组合定义。同样,此值比文件中使用的最高对象号大1。
注意:交叉引用节中数量大于此值的任何对象都将被忽略,并被视为丢失。
Prev integer (仅当文件具有多个交叉引用节时才存在;不得为间接引用)从文件开头到上一个交叉引用节开头的字节偏移量。
Root dictionary (必需;必须是间接引用)文件中包含的PDF文档的目录字典。
Encrypt dictionary (如果文档是加密的,则为必需;PDF 1.1)该文档的加密字典。
Info dictionary (可选;必须是间接引用)文档的信息字典。
ID array (可选,但强烈建议使用;PDF 1.1)由两个字节字符串组成的数组,构成文件的文件标识符。这两个字节字符串应为直接对象,并且应未加密。尽管此条目是可选的,但缺少该条目可能会阻止文件在依赖于唯一标识文件的某些工作流程中起作用。

注意:表1定义了一个附加条目XRefStm,它仅出现在混合引用文件的尾部。

示例3显示了从未更新过的文件的示例trailer(如trailer字典中缺少Prev条目所示)。

示例3

trailer
  <<
    /Size 22
    /Root 2 0 R
    /Info 1 0 R
    /ID [ < 81b14aafa313db63dbd6f981e49f94f4 >
          < 81b14aafa313db63dbd6f981e49f94f4 > ]
  >>
startxref
18799
%%EOF