使用pypdftk在Windows开发服务器上的虚拟环境中填写Django项目中的pdf表单时,由于找不到pdf文件而导致“非零退出状态1”

2024-03-28 23:37:19 发布

您现在位置:Python中文网/ 问答频道 /正文

以下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. 在view函数中运行上述代码,并将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. 使用form.pdf文件的c:\...的完整路径运行上述两个

我还验证了,当django项目不执行时,我可以在两个存储驱动器上的同一文件夹中,从django项目本身成功地用正在执行的.py文件和form.pdf文件填充表单。在这种情况下,pdftk发现forms.py没有任何问题

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

有趣的是,我的一个朋友在windows中遇到了相同的错误消息。我知道pdftk在windows中有时会很敏感,我想这里可能有一点我没有注意到

我想要的结果是在django项目中填写一份pdf表格,其中包含通过post请求从表格中获得的数据

我希望有人能告诉我为什么pdftk在django项目中使用表单文件时很难看到或使用表单文件,并为我指明正确的方向

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


Tags: 文件pyform表单outputdatapdfout
1条回答
网友
1楼 · 发布于 2024-03-28 23:37:19

刚才就Reddit回答的问题: 在Django,是wsgi.pymanage.py对发生的事情负最终责任。在此基础上,将form.pdf文件放在与wsgy.py相同的文件夹中解决了问题,代码现在按预期运行,一个未绑定的表单将数据发布回视图,一个pdf表单被填写,一个副本用所述数据保存。希望这能帮助任何遇到这种情况的人

相关问题 更多 >