// use this delimiter for serializing our array
var bp_delim= '%#%#';
function SaveData( data )
{
// data is an array of arrays that needs
// to be serialized and stored into a persistent
// global string
var ds= '';
for( ii= 0; ii< data.length; ++ii )
{
for( jj= 0; jj< 3; ++jj )
{
if( ii!= 0 || jj!= 0 )
ds+= bp_delim;
ds+= data[ii][jj];
}
}
global.pdf_hacks_js_bookmarks= ds;
global.setPersistent( "pdf_hacks_js_bookmarks", true );
}
function GetData() {
// reverse of SaveData; return an array of arrays
if( global.pdf_hacks_js_bookmarks== null ) {
return new Array(0);
}
var flat= global.pdf_hacks_js_bookmarks.split( bp_delim );
var data= new Array();
for( ii= 0; ii< flat.length; ) {
var record= new Array();
for( jj= 0; jj< 3 && ii< flat.length; ++ii, ++jj ) {
record.push( flat[ii] );
}
if( record.length== 3 ) {
data.push( record );
}
}
return data;
}
//Get Current Date
function DateNow(){
var d, s ;
d = new Date();
s = d.getFullYear()+"/";
s += (d.getMonth() + 1) + "/";
s += d.getDate() ;
/**//*
s += d.getHours() + ":";
s += d.getMinutes() + ":";
s += d.getSeconds() ;
*/
return(s);
}
function AddBookmark() {
// query the user for a name, and then combine it with
// the current PDF page to create a record; store this record
var thisfilename=this.documentFileName;
thisfilename=thisfilename.substr(0,thisfilename.lastIndexOf("."));
var numPlugInss=this.pageNum+1;
var currentdate=DateNow();
var label=
app.response( "书签名称,可以修改以便于记忆:",
"书签名称",
"《"+thisfilename+"》第 "+numPlugInss+" 页/共 "+this.numPages+" 页 "+currentdate,
false );
if( label!= null ) {
var record= new Array(3);
record[0]= label;
record[1]= this.path;
record[2]= this.pageNum;
data= GetData();
data.push( record );
SaveData( data );
}
}
function ShowBookmarks() {
// show a pop-up menu; this seems to only work when
// a PDF is alreay in the viewer;
var data= GetData();
var items= '';
for( ii= 0; ii< data.length; ++ii ) {
if( ii!= 0 )
items+= ', ';
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
}
// assemble the command and the execute it with eval()
var command= 'app.popUpMenu( '+ items+ ' );';
var selection= eval( command );
if( selection== null ) {
return; // exit
}
// the user made a selection; parse out its index and use it
// to access the bookmark record
var index= 0;
// toString() converts the String object to a string literal
// eval() converts the string literal to a number
index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
if( index< data.length ) {
try {
// the document must be 'disclosed' for us to have any access
// to its properties, so we use these FirstPage NextPage calls
//
app.openDoc( data[index][1] );
app.execMenuItem( "FirstPage" );
for( ii= 0; ii< data[index][2]; ++ii ) {
app.execMenuItem( "NextPage" );
}
}
catch( ee ) {
var response=
app.alert("打开书签错误. 是否删除本书签?", 2, 2,"删除书签");
if( response== 4 && index< data.length ) {
data.splice( index, 1 );
SaveData( data );
}
}
}
}
function DropBookmark() {
// modelled after ShowBookmarks()
var data= GetData();
var items= '';
for( ii= 0; ii< data.length; ++ii ) {
if( ii!= 0 )
items+= ', ';
items+= '"'+ ii+ ': '+ data[ii][0]+ '"';
}
var command= 'app.popUpMenu( '+ items+ ' );';
var selection= eval( command );
if( selection== null ) {
return; // exit
}
var index= 0;
index= eval( selection.substring( 0, selection.indexOf(':') ).toString() );
if( index< data.length ) {
data.splice( index, 1 );
SaveData( data );
}
}
function ClearBookmarks() {
if( app.alert("确认要清除所有的书签吗?", 2, 2,"删除书签" )== 4 ) {
SaveData( new Array(0) );
}
}
app.addMenuItem( {
cName: "-", // menu divider
cParent: "View", // append to the View menu
cExec: "void(0);" } );
app.addMenuItem( {
cName: "设置本页为书签(&B)",
cParent: "View",
cExec: "AddBookmark();",
cEnable: "event.rc= (event.target != null);" } );
app.addMenuItem( {
cName: "转到指定书签(&T)",
cParent: "View",
cExec: "ShowBookmarks();",
cEnable: "event.rc= (event.target != null);" } );
//cEnable: "event.rc= true;" } );
app.addMenuItem( {
cName: "删除一个书签(&D)",
cParent: "View",
cExec: "DropBookmark();",
cEnable: "event.rc= (event.target != null);" } );
app.addMenuItem( {
cName: "清除所有书签(&C)",
cParent: "View",
cExec: "ClearBookmarks();",
cEnable: "event.rc= true;" } );
将以上代码存为bookmark_page.js,放入D:\Program Files\Adobe\Reader 8.0\Reader\Javascripts目录下,然后重启reader。
相关推荐
### 教你怎样给PDF文件添加书签 #### 背景与意义 在日常学习、工作中,我们经常需要阅读大量的PDF文档。然而,对于长时间的阅读或查阅多个文档时,经常会遇到一个问题:如何标记阅读进度或者快速找到之前查看过的...
标题中的“知网pdf加书签.rar”表明这个压缩包包含了一种方法或工具,用于在从中国知网(CNKI)下载的PDF文件中添加书签。中国知网是著名的学术文献数据库,用户常常需要下载PDF格式的论文进行阅读和研究。在PDF文件...
标题中的"word批量转pdf带书签.rar"指的是一个压缩包文件,它的主要功能是将多份Word文档转换成PDF格式,并且转换后的PDF文件会带有书签,这对于组织和导航长文档非常有帮助。书签在PDF中起到了目录的作用,用户可以...
1. 选择或打开PDF文件:首先,你需要选择或打开包含需要加书签的PDF文件。 2. 导入文件到工具:将PDF文件导入到批量处理工具中,可能需要通过点击“添加文件”或拖放操作。 3. 设置书签:定义书签的层级结构,如...
v1.1的更新确保了每个PDF文件都可以拥有自己的独立书签,这样用户在切换不同文件时,其对应的书签仍然能够正确显示和使用,提高了工作效率。 在压缩包中,有两个文件:`bookmark.js`和`readme.txt`。`bookmark.js`...
这个Demo的执行流程大致是这样的:通过命令行指定PDF文件路径和输出格式(JSON或文本),然后运行`bookmark.py`脚本,它会读取PDF,提取书签,将其转换为JSON格式,并根据用户选择的输出方式写入文件。 Python的...
书签文本生成后,通过运行`import_bookmark.cmd`命令行脚本,将这些书签导入到PDF文件中,利用PDFtk的强大功能。 标签中的“python 软件/插件 pandas”表明这个流程依赖于Python编程语言以及pandas库来处理数据,...
源资源来自...pdf一直没有原生支持的书签功能,用一个js脚本就可以实现了。由于原文时间较长,放在最新版本的adobe reader XI 里会出错,个人调试修改了几个地方就可以支持最新版本的了
PyPDF2 是一个用于操作PDF文件的纯Python库,它可以读取PDF文件的内容,包括元数据、页面、文本、书签、加密、分割和合并PDF等。对于提取PDF文件的目录,PyPDF2提供了`PdfFileReader`类,通过这个类我们可以获取到...
PDF文件结构查看器是一款专为分析PDF文档设计的工具,它可以帮助用户深入理解PDF文件的内部构造,并进行数据提取。PDF(Portable Document Format)是一种广泛使用的文档格式,它能够跨平台保持一致的显示效果,因此...
在本文中,我们将探讨如何使用JavaScript为PDF文件添加书签,以及如何在Adobe Reader中实现这一功能。PDF文件中的书签对于组织和导航长文档非常有用,尤其在阅读电子书时。通过使用JavaScript,我们可以创建自定义...
- 将书签写入PDF文件 在实际开发中,我们可能需要结合PDF处理库,如Adobe的PDF Library、PDFBox(Java)、PyPDF2(Python)或PDF.js(JavaScript)等。这些库提供了API接口,用于操作PDF的元数据、内容和结构,包括...
5. **自定义书签**:用户可以根据自己的需求为每个PDF文件创建定制的书签,比如为章节命名,设置不同的颜色以便区分,甚至可以添加子书签形成层次结构。 6. **兼容性**:好的批量书签编辑工具应该兼容多种PDF标准,...
5. **编写代码**:使用PB的脚本语言(通常为PBL语言)编写事件处理函数,例如在控件加载时打开指定的PDF文件,或者响应用户的交互操作。 6. **测试与调试**:运行应用程序,确保PDF文件能够正确预览,并且所有预期的...
8. **安全性**:由于PDF文件可能包含恶意代码,软件应有安全机制来防止执行潜在有害的动作,例如JavaScript脚本。 9. **多平台支持**:虽然主要讨论的是C#,但若想实现跨平台,可以选择.NET Core或.NET 5,这样可以...
3. **书签和超链接**:如果源PDF文件包含书签或超链接,合并工具需要将这些元数据一并合并,保持文件的导航功能。 4. **安全性**:如果源PDF文件被加密或设置访问权限,合并工具需要处理这些安全设置,以确保新文件...
10g编程艺术:深入数据库体系结构_有图.pdf”看似与标题“通过书签来注入JS”无关,可能是一个关于Oracle数据库编程的资源,提供了对Oracle 9i和10g版本的深入理解,包括数据库的体系结构、SQL语法、存储过程等。...
本教程将详细介绍如何使用脚本命令将PDF文件转换为SWF格式。 首先,你需要一个转换工具,如Adobe Acrobat Pro或者开源的PDF2SWF工具。这里我们假设你已经安装了PDF2SWF工具,这是一个命令行工具,适用于Linux、...
此外,还有书签、表单字段和动作脚本等功能,增强了文档的交互性。 8. 加密和安全:PDF允许对文件进行加密,保护内容不被未经授权的访问。同时,还可以设置权限,限制打印、复制、编辑等操作。 9. 压缩:PDF文件...
此版本的PDF参考手册是理解和操作PDF文件的基础。 PDF 1.7的特性包括: 1. **结构化内容**:PDF文件可以包含结构化元数据,允许文档内容被索引、搜索和访问。这有助于无障碍阅读和信息检索。 2. **多媒体支持**:...