如何自动和手动保存prestashop发票?

时间:2017-04-28 12:40:52

标签: python pdf-generation prestashop prestashop-1.6 invoice

我想自动打印发票(pdf),最近保存在服务器上的内容。并且还可以手动保存

我正在使用prestashop 1.6.1,发票主要是从prestashop管理页面下载的,但我需要更简单的方法来打印这些发票,所以我为自己制作了一个管理页面,它看起来像这样: enter image description here

打印机按钮具有发票生成地址的href 状: “ http://www.example.com/admin/index.php?controller=AdminPdf&submitAction=generateInvoicePDF&id_order=3230

从链接中我可以下载它,然后在pdf阅读器中打开时打印它,但我想一键完成。

Soo ......我制作了一个脚本,用于在保存在某个特定位置时自动打印pdf

    #! /usr/bin/python import os
import os
import time
import os.path
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler



class ExampleHandler(FileSystemEventHandler):
    def on_created(self, event): 
    output=str(event.src_path.replace("./",""))
    print(output)
        #print event.src_path.replace("./","")
        print "Got event for file %s" % event.src_path
    os.system("lp -d HL2250DN %s" % output)

observer = Observer()
event_handler = ExampleHandler() 
observer.schedule(event_handler, path='.',recursive=False)
observer.start()

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()

observer.join()

有两种方法可以自动将其下载到服务器

1。覆盖PDF.php和PDFGenerator.php文件,如下所示:

PDF.php       

class PDF extends PDFCore
{
    public function render($display = true)
    {
        if($this->template == PDF::TEMPLATE_INVOICE)
            parent::render('F', true);

        return parent::render($display);
    }
}

?>

PDFGenerator.php

    <?php

 class PDFGenerator extends PDFGeneratorCore
{
    public function render($filename, $display = true)
    {
        if (empty($filename)) {
            throw new PrestaShopException('Missing filename.');
        }

        $this->lastPage();

        if ($display === true) {
            $output = 'D';
        } elseif ($display === false) {
            $output = 'S';
        } elseif ($display == 'D') {
            $output = 'D';
        } elseif ($display == 'S') {
            $output = 'S';
        } elseif ($display == 'F') {
            $output = 'F';
            $filename = '/folder/for/print_it/'.str_replace("#", "", $filename);
        } else {
            $output = 'I';
        }

        return $this->output($filename, $output);
    }
}

?>

2。使用脚本下载

首次尝试

第一个选项适用于自动保存,但当我尝试手动保存发票时,我得到一个空白或损坏的pdf文件。我也试图改变pdf.php,但它对我来说是有用的。还发了一篇关于此事的帖子:Prestashop saving invoices manually and automatically。没有给出答案,我继续选择第二个选项。

第二次尝试

我尝试使用python脚本下载发票,但它有效,但我怎么知道要下载哪一个?

    #!/usr/bin/env python
import requests
import webbrowser

url = "http://www.example.com/admin/index.php?controller=AdminLogin&token=5a01dc4e606bca6c26e95ddea92d3d15"
url2 = "http://www.example.com/admin/index.php?controller=AdminPdf&token=35b276c05aa6f5eb516737a8d534eb66&submitAction=generateInvoicePDF&id_order=3221"
payload = {'example': 'example',
    'example': 'example',
    'stay_logged_in':'2',
    'submitLogin':'1',}

with requests.session() as s:
    # fetch the login page
    s.get(url)

    # post to the login form
    r = s.post(url, data=payload)
    print(r.text)

    response = s.get(url2)

    with open('/tmp/metadataa.pdf', 'wb') as f:
    f.write(response.content) 

所以这个选项的问题是..如何将href(从打印机按钮点击的内容)传递给url?

解决这个问题非常令人沮丧,我知道有一个简单易用的选项,但我仍然在寻找这个。

1 个答案:

答案 0 :(得分:1)

每次生成发票PDF时,都会强制将其保存为本地文件。

您要做的是在打印按钮上添加一个额外的GET参数,并检查它在overriden类中的存在,以便在您想直接打印时,PDF只会存储为本地文件。

首先添加一个GET参数来打印按钮,例如。 &print=1。您可以在模板中或生成这些按钮的任何位置,以便按钮的href如下所示:

http://www.example.com/admin/index.php?controller=AdminPdf&submitAction=generateInvoicePDF&id_order=3230&print=1

现在您可以检查PDF类中是否存在参数,然后强制将PDF输出到本地文件。

class PDF extends PDFCore
{
    public function render($display = true)
    {
        if($this->template == PDF::TEMPLATE_INVOICE && Tools::getValue('print') == 1) {
            // Output PDF to local file
            parent::render('F');
            // Redirect back to the same page so you don't get blank page 
            Tools::redirectAdmin(Context::getContext()->link->getAdminLink('AdminMyController'));
        }
        else {
            return parent::render($display);
        }
    }
}

您可以按原样保留覆盖PDFGenerator类。