首页 > 解决方案 > “非零退出状态 1”由于使用 pypdftk 在 Windows 开发服务器上的虚拟环境中的 Django 项目中填写 pdf 表单时找不到 pdf 文件

问题描述

以下python代码成功填写了一个pdf表单:

import pypdftk

data_dict = {key:value pairs}
PDF_PATH = 'form.pdf'                #form to be filled out in same folder as the file executing this code
out_file = 'out_file.pdf'            #completed pdf file
generated_pdf = pypdftk.fill_form(
    pdf_path = PDF_PATH,
    datas = data_dict,
    out_file = out_file,
    )

但是,在我的 django 项目中使用的相同代码会导致以下错误消息:

Error: Unable to find file.
Error: Failed to open PDF file:
   form.pdf
Errors encountered.  No output created.
Done.  Input errors, so no output created.

... REMAINDER OF TRACEBACK EXCLUDED FOR BREVITY IF YOU WANT TO SEE IT I'LL POST...

raise subprocess.CalledProcessError(retcode, cmd, output=output) output=output)                                      df fill_form C:\Users\Home\AppData\Local\Temp\tmpbqq__7c4 output out_file.pdf flatten
subprocess.CalledProcessError: Command 'pdftk l_a_r.pdf fill_form C:\Users\Home\AppData\Local\Temp\tmpbqq_0 87495_7c4 output out_file.pdf flatten'
returned non-zero exit status 1.

pypdftk 安装在项目运行的虚拟环境中。pdftk 服务器作为 windows 路径变量添加。在上面的示例中,每隔一次发生这种情况,错误消息末尾引用的临时文件都包含 XML 中的所有预期数据。

我尝试了以下代码组合来尝试使其工作:

  1. 在视图函数中运行上面的代码,将 pdf 表单填写在与 views.py 文件相同的文件夹中:
import pypdftk

def filler_view(request):
    form = MyForm()
    if request.method =='POST':
       #code to successfully populate dictionary data_dict with form data
       
       PDF_PATH = 'form.pdf'                #form to be filled out in same folder as the file executing this code
       out_file = 'out_file.pdf             #completed pdf file
       generated_pdf = pypdftk.fill_form(
       pdf_path = PDF_PATH,
       datas = data_dict,
       out_file = out_file,
       )
    return render(request, 'success.html')
  1. 将代码和文件存储在文件夹中并导入以在视图中调用相关函数:
-appFolder
 -pfd_filler_folder
  -form.pdf
  -form_filler.py
 -views.py
views.py

from appFolder.pdf_filler_folder import form_filler as f

def filler_view(request):
    form = MyForm()
    if request.method =='POST':
       #code to successfully populate dictionary data_dict with form data
       f.fill_form(data_dict, 'output.pdf')

form_filler.py:
import pypdftk

def fill_form(data_dict, out_file):
    PDF_PATH = 'form.pdf'
    generated_pdf = pypdftk.fill_form(
        pdf_path = PDF_PATH,
        datas = data_dict,
        out_file = out_file,
    )
  1. c:\...使用 form.pdf 文件的完整路径运行上述两个文件。

我还验证了当没有被 django 项目执行时,我可以成功地在两个存储驱动器上的同一文件夹中以及 django 项目本身中使用正在执行的 .py 文件和 form.pdf 文件填写表单。在这种情况下,pdftk 可以毫无问题地找到 forms.py。

我相信文件未找到错误消息是关键,因为它似乎是指我试图填写的 pdf 表格。我从 1500 年到 1800 年一直在研究这个问题,但我没有设法让它工作,尽管我相信我的错误消息表明 cl 执行命令中缺少参数。我不确定这会是什么,因为所有参数似乎都存在且正确。

有趣的是,我的一个朋友在 Windows 中遇到了同样的错误消息。我知道 pdftk 有时在 Windows 中可能很敏感,我认为我可能在这里遗漏了一些细微差别。

我想要的结果是从我的 django 项目中填写一个 pdf 表单,其中数据是通过发布请求从表单中获得的。

我欢迎有人告诉我为什么 pdftk 在我的 django 项目中使用时难以查看或使用表单文件并为我指明正确的方向

我知道使用 pdftk 有其他选择,但 pdftk 是最简单的,老实说 pypdftk 是我发现的唯一一个可以可靠地与 python 一起使用以在 Windows 中填写 pdf 表单的库。我不想继续生成我自己的副本表单并用数据填充它,但我知道这也是一种选择。

标签: pythondjangopdfpdftk

解决方案


刚刚在 Reddit 上回答的问题:在 Django 中,它要么wsgi.py或要么manage.py最终负责所发生的事情。在此基础上,将form.pdf文件放在与解决问题相同的文件夹中wsgy.py,代码现在按预期运行,未绑定的表单将数据发送回视图,并填写了 pdf 表单,并与所述数据一起保存了副本。希望对遇到此问题的其他人有所帮助!


推荐阅读