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

Removing javascript print code embedded in pdf

本文关键字:javascript 打印 代码 中的 pdf 删除      更新时间:2023-09-26

我有一台生成PDF的服务器,我无法访问或无法更改服务器上的设置。

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

文件开头的代码如下所示:

%PDF-1.4 %âãÏÓ 1 0 obj <</S/JavaScript/JS(this.print'(true , 0,this.numPages-1,false');'r)>> endobj 3 0 obj <</Length 10/Filter/FlateDecode>>stream xœ+ä SNIP

我认为删除javascript行并防止弹出自动打印屏幕是一件容易的事。

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

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

下面是源文件的链接:https://www.dropbox.com/s/kziy6evi57cfhb3/2014-04-04_EIKY.pdf (800k)

有没有办法使 pdf 对象或类似的东西无效?

谢谢。

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

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

对此

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

例如。

简单的方法:

  1. 使用记事本++或类似的编辑器打开文件。
  2. 查找触发打印对话框的 JavaScript 代码。您可以使用编辑器的查找对话框 (CTL+F) 并使用字符串"这个.print"。代码的其余部分可能会因文档而异。
  3. 选择 JS 指令括号内的所有字符并计算字符数。

    例如

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

    见附图1

  4. 将括号内的所有内容替换为确切数量的分号。

    /JS (

  5. ;;;
  6. 保存文档。

@SakthiSureshAnand正在寻找我使用的代码/库。这真的没什么特别的,但我想我会把它留在这里。

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

然后preg_replace我用来替换不需要的打印代码并将 admed 文件写入磁盘。

$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.

希望对某人有所帮助。

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