我正在尝试了解回溯错误。见下文。
我正在做的是用 Python 操作 PDF 表单字段。我使用 pdftk 和 fdfgen,只是使用 Python 操作 PDF 表单字段,我按照这个示例http://evanfredericksen.blogspot.mx/2014/03/manipulating-pdf-form-fields-with-python.html
Traceback:
File "/home/myproject/webapps/app/lib/python2.7/Django-1.11.7-py2.7.egg/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/home/myproject/webapps/app/lib/python2.7/Django-1.11.7-py2.7.egg/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/myproject/webapps/app/lib/python2.7/Django-1.11.7-py2.7.egg/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/myproject/webapps/app/app/home/views.py" in main
113. fields = get_fields(pdf_path)
File "/home/myproject/webapps/app/app/home/views.py" in get_fields
67. data_string = check_output(call).decode('utf8')
File "/usr/lib64/python2.7/subprocess.py" in check_output
568. process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib64/python2.7/subprocess.py" in __init__
711. errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py" in _execute_child
1327. raise child_exception
Exception Type: OSError at /pdf_test/1/
Exception Value: [Errno 2] No such file or directory
我的意见代码是:
def combine_pdfs(list_of_pdfs, outfile):
'''
Use pdftk to combine multiple pdfs into a signle pdf
'''
call = ['pdftk']
call += list_of_pdfs
call += ['cat', 'output']
call += [outfile]
print(" ".join(call))
try:
data_string = check_output(call).decode('utf8')
except IOError:
raise PdftkNotInstalledError('Could not locate PDFtk installation')
return outfile
def get_fields(pdf_file):
'''
Use pdftk to get a pdf's fields as a string, parse the string
and return the fields as a dictionary, with field names as keys
and field values as values.
'''
fields = {}
call = ['pdftk', pdf_file, 'dump_data_fields_utf8']
try:
data_string = check_output(call).decode('utf8')
except IOError:
raise PdftkNotInstalledError('Could not locate PDFtk installation')
data_list = data_string.split('\r\n')
if len(data_list) == 1:
data_list = data_string.split('\n')
for line in data_list:
if line:
re_object = match(r'(\w+): (.+)', line)
if re_object is not None:
if re_object.group(1) == 'FieldName':
key = re_object.group(2)
fields[key] = ''
elif re_object.group(1) == 'FieldValue':
fields[key] = re_object.group(2)
return fields
def write_pdf(source, fields, output, flatten=False):
'''
Take a source file path, list or dictionary of fdf fields, and
output path, and create a filled-out pdf.
'''
fdf = forge_fdf(fdf_data_strings=fields)
with NamedTemporaryFile(delete=False) as file:
file.write(fdf)
call = ['pdftk', source, 'fill_form', file.name, 'output', output]
if flatten:
call.append('flatten')
try:
check_output(call)
except IOError:
raise PdftkNotInstalledError('Could not locate PDFtk installation')
remove(file.name)
class PdftkNotInstalledError(Exception):
pass
def main(request,pk):
if pk:
obj = MyModel.objects.get(pk=pk)
if obj.text == 'Secure':
pdf_path = "/home/myproject/webapps/app/app/home/templates/home/fill.pdf"
fields = get_fields(pdf_path)
fields['F[0].P1[0].Name[0]'] = obj.name
write_pdf(pdf_path,fields,'output.pdf')
return HttpResponseRedirect('/Search')
urls.py 是:
url(r'^pdf_test/(?P<pk>[-\w]+)/$', views.main, name='pdf_test')