删除pdf中嵌入的javascript打印代码

删除pdf中嵌入的javascript打印代码,javascript,pdf,Javascript,Pdf,我有一个生成PDF的服务器,我没有权限或能力更改服务器上的设置 当服务器生成pdf时,它会将以下javascript代码嵌入到文件中,以便当任何pdf阅读器/查看器打开它时,打印文档屏幕自动打开。这是非常不方便和令人沮丧的 文件中最开始的代码如下所示: <</S/JavaScript/JS(this.print\(true , 0,this.numPages-1,false\);\r)>> %PDF-1.4 %âãÏÓ 10 obj endobj 30 obj 流动 x

我有一个生成PDF的服务器,我没有权限或能力更改服务器上的设置

当服务器生成pdf时,它会将以下javascript代码嵌入到文件中,以便当任何pdf阅读器/查看器打开它时,打印文档屏幕自动打开。这是非常不方便和令人沮丧的

文件中最开始的代码如下所示:

<</S/JavaScript/JS(this.print\(true , 0,this.numPages-1,false\);\r)>>
%PDF-1.4
%âãÏÓ
10 obj
endobj
30 obj
流动
xœ+ä
剪断

我认为删除javascript行并防止自动打印屏幕弹出是一项简单的任务

我已经试过了(只是做了一次字符串搜索,替换并删除了第4行)。这确实会阻止打印屏幕的出现,但当在几个PDF查看器(goodreader等)中打开时,会立即标记为已损坏的PDF

我可以点击修复选项,一切正常,但我想知道,我能做些什么,用某种NOOP代码替换javascript代码,以防止文件损坏,同时防止打印页面

这里有一个指向源文件的链接:(800k)

有没有办法使pdf对象或类似对象无效


谢谢。

由于PDF已进行检查,以确保内容长度在某些点没有更改,因此您无法添加或删除字符。但你可以改变它们。您可以这样更改它:

<</S/JavaScript/JS(this.print\(true , 0,this.numPages-1,false\);\r)>>

对此

<</S/JavaScript/JS(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r)>>


例如。

使用Windows上的Foxit Reader,您可以将文档打印为PDF,生成的PDF不再具有Javascript操作。

@sakthisureshand正在查找我使用的代码/库。这真的没什么特别的,但我想我还是把它留在这里吧

一个简单的php脚本请求原始文件,然后我们以字符串形式获取文件内容:

然后preg_replace就是我用来替换不需要的打印代码并将admended文件写入磁盘的全部内容

$fileString = file_get_contents('source.pdf');

$pdf = preg_replace(
  '%(<</S/Javascript/JS\()(.*;)(.*)%i',
  '<</S/Javascript/JS(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r)>>',
  $fileString
);


//Do what you want with the fixed $pdf string.

$fileString=file_get_contents('source.pdf');
$pdf=preg_替换(
“%(简单的方法:

  • 使用记事本++或类似编辑器打开文件
  • 找到触发打印对话框的javascript代码。您可以 使用编辑器的“查找”对话框(ctl+f)并使用字符串 “this.print”。其余的代码可能会随着文档的不同而变化
  • 选择JS指令括号内的所有字符并计算字符数

    /JS(this.print({bUI:true,bSilent:false,bShrinkToFit:true});

    见附图

  • 将括号内的所有内容替换为分号的精确数字

    /JS(;;;;;;;;;;;

  • 保存文档


  • 刚刚测试过,现在效果很好!谢谢你的快速回答!如果你胆敢在PDF文件中闲逛,字符数必须保持不变的原因是PDF有一个外部参照表,其中对象的开头列为与文件开头的偏移量。通过删除内容,偏移量不会太长呃,正确。一个行为良好的PDF查看器试图修复这个问题,但有一些限制,然后文档就永远被破坏了。你用什么编辑器从PDF中删除javascript?任何文本编辑器都应该可以工作。在Windows、记事本、Linux或OSX、vim上。@JoeFrambach它看起来像胡言乱语,我找不到我知道嵌入的javascript。可能是它需要复杂的编码设置?因此,文档所有者打算在文档打开后立即打印文档。事实上,执行JavaScript ins的命令不在obj 1中(它只包含要执行的代码),但在另一个对象中,它指的是obj 1。在PDF中使用文本编辑器可能会对文件造成危险;使用十六进制编辑器的风险已经较小。但是说到“清理”对于一整套文档,建议使用适当的工具。您可能愿意花一些时间使用其中一个库来开发一些东西,或者您可能会查看一些商业工具(例如,您可能会与Appligent交谈)。这只是一个个人项目。它迫使我的ipad和其他设备上出现打印预览屏幕,这只是一个麻烦,而不是一个表演的障碍。这个快速的“黑客”这是我在这个阶段所需要的一切。谢谢你提供的信息。@PilotSnipes你能告诉我们,你使用了哪个库来解析pdf文件吗。如果可能的话,你能上传你的脚本部分吗?@Sakthisureshan,这真的不是什么新奇的东西。到今天它仍然有效!我将在下面留下我的代码作为一个新的答案。