我有一台生成PDF的服务器,我无法访问或无法更改服务器上的设置。
当服务器生成pdf时,它会将以下javascript代码嵌入到文件中,以便在任何PDF阅读器/查看器打开时,PRINT DOCUMENT屏幕会自动打开。这非常不方便且令人沮丧。
一开始文件中的代码如下所示:
%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查看器中打开时(goodreader等)会立即标记为损坏的PDF。
我可以点击修复选项,一切正常,但我想知道,有什么我可以做的用一些NOOP代码替换javascript代码,以防止文件损坏同时仍然阻止打印网页?
以下是源文件的链接:https://www.dropbox.com/s/kziy6evi57cfhb3/2014-04-04_EIKY.pdf(800k)
有没有办法取消pdf对象或类似的东西?
谢谢。
答案 0 :(得分:7)
由于PDF已进行检查以确保内容长度在某些点未发生变化,因此您无法添加或删除字符。但你可以改变它们。您可以这样更改:
<</S/JavaScript/JS(this.print\(true , 0,this.numPages-1,false\);\r)>>
到这个
<</S/JavaScript/JS(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r)>>
例如。
答案 1 :(得分:2)
简单方法:
选择JS指令括号内的所有字符,并计算字符数。例如
/ JS( this.print({bUI:true,bSilent:false,bShrinkToFit:true}); )
请参阅附件图片1
将括号内的所有内容替换为确切数量的分号。例如
/ JS( ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;; )
保存文档。
答案 2 :(得分:1)
使用Windows上的Foxit Reader,您可以将文档打印为PDF,并且生成的PDF不再具有Javascript操作。
答案 3 :(得分:1)
@SakthiSureshAnand正在寻找我使用的代码/库。确实没什么特别的,但我想我把它留在这里。
一个简单的php脚本请求原始文件,然后我们以字符串的形式获取文件的内容:
然后用preg_replace替换不需要的打印代码并将推荐的文件写入磁盘。
$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.
希望能帮助别人。