1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ##############################################################################
22 """ Copyright (c) 2003-2007 LOGILAB S.A. (Paris, FRANCE).
23 http://www.logilab.fr/ -- mailto:contact@logilab.fr
25 manipulate pdf and fdf files. pdftk recommended.
27 Notes regarding pdftk, pdf forms and fdf files (form definition file)
28 fields names can be extracted with:
29 pdftk orig.pdf generate_fdf output truc.fdf
31 pdftk orig.pdf fill_form test.fdf output result.pdf [flatten]
32 without flatten, one could further edit the resulting form.
33 with flatten, everything is turned into text.
36 from future import with_statement
63 def output_field( f ):
64 return "\xfe\xff" + "".join( [ "\x00"+c for c in f ] )
66 def extract_keys(lines):
69 if line.startswith('/V'):
70 pass #print 'value',line
71 elif line.startswith('/T'):
73 key = ''.join(key.split('\x00'))
77 def write_field(out, key, value):
80 out.write("/V (%s)\n" %value)
83 out.write("/T (%s)\n" % output_field(key) )
86 def write_fields(out, fields):
90 write_field(out, key, value)
91 # write_field(out, key+"a", value) # pour copie-carbone sur autres pages
94 def extract_keys_from_pdf(filename):
95 # what about using 'pdftk filename dump_data_fields' and parsing the output ?
96 tmp_file = tempfile.mkstemp(".fdf")[1]
98 os.system('pdftk %s generate_fdf output \"%s\"' % (filename, tmp_file))
99 with open(tmp_file, "r") as ofile:
100 lines = ofile.readlines()
106 return extract_keys(lines)
109 def fill_pdf(infile, outfile, fields):
110 tmp_file = tempfile.mkstemp(".fdf")[1]
112 with open(tmp_file, "w") as ofile:
113 write_fields(ofile, fields)
114 os.system('pdftk %s fill_form \"%s\" output %s flatten' % (infile, tmp_file, outfile))
121 def testfill_pdf(infile, outfile):
122 keys = extract_keys_from_pdf(infile)
125 fields.append( (key, key, '') )
126 fill_pdf(infile, outfile, fields)
129 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: