-
Notifications
You must be signed in to change notification settings - Fork 21
/
make-pdf-javascript.py
71 lines (58 loc) · 3.07 KB
/
make-pdf-javascript.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/python
# V0.1 2008/05/23
# make-pdf-javascript, use it to create a PDF document with embedded JavaScript that will execute automatically when the document is opened
# requires module mPDF.py
# Source code put in public domain by Didier Stevens, no Copyright
# https://DidierStevens.com
# Use at your own risk
#
# History:
#
# 2008/05/29: continue
# 2008/11/09: cleanup for release
import mPDF
import optparse
def Main():
"""make-pdf-javascript, use it to create a PDF document with embedded JavaScript that will execute automatically when the document is opened
"""
parser = optparse.OptionParser(usage='usage: %prog [options] pdf-file', version='%prog 0.1')
parser.add_option('-j', '--javascript', help='javascript to embed (default embedded JavaScript is app.alert messagebox)')
parser.add_option('-f', '--javascriptfile', help='javascript file to embed (default embedded JavaScript is app.alert messagebox)')
(options, args) = parser.parse_args()
if len(args) != 1:
parser.print_help()
print ''
print ' make-pdf-javascript, use it to create a PDF document with embedded JavaScript that will execute automatically when the document is opened'
print ' Source code put in the public domain by Didier Stevens, no Copyright'
print ' Use at your own risk'
print ' https://DidierStevens.com'
else:
oPDF = mPDF.cPDF(args[0])
oPDF.header(version=1.5)
oPDF.indirectobject(1, 0, '<<\n /Type /Catalog\n /Outlines 2 0 R\n /Pages 3 0 R\n /OpenAction 7 0 R\n>>')
oPDF.indirectobject(2, 0, '<<\n /Type /Outlines\n /Count 0\n>>')
oPDF.indirectobject(3, 0, '<<\n /Type /Pages\n /Kids [4 0 R]\n /Count 1\n>>')
oPDF.indirectobject(4, 0, '<<\n /Type /Page\n /Parent 3 0 R\n /MediaBox [0 0 612 792]\n /Contents 5 0 R\n /Resources <<\n /ProcSet [/PDF /Text]\n /Font << /F1 6 0 R >>\n >>\n>>')
oPDF.stream(5, 0, 'BT /F1 12 Tf 100 700 Td 15 TL (JavaScript example) Tj ET')
oPDF.indirectobject(6, 0, '<<\n /Type /Font\n /Subtype /Type1\n /Name /F1\n /BaseFont /Helvetica\n /Encoding /MacRomanEncoding\n>>')
if options.javascript == None and options.javascriptfile == None:
javascript = """app.alert({cMsg: 'Hello from PDF JavaScript', cTitle: 'Testing PDF JavaScript', nIcon: 3});"""
elif options.javascript != None:
javascript = options.javascript
else:
try:
fileJavasScript = open(options.javascriptfile, 'rb')
except:
print "error opening file %s" % options.javascriptfile
return
try:
javascript = fileJavasScript.read()
except:
print "error reading file %s" % options.javascriptfile
return
finally:
fileJavasScript.close()
oPDF.indirectobject(7, 0, '<<\n /Type /Action\n /S /JavaScript\n /JS (%s)\n>>' % javascript)
oPDF.xrefAndTrailer('1 0 R')
if __name__ == '__main__':
Main()