[addon pdfresponse] PdfResponse

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
TOMeek
Člen | 64
+
0
-

Po upgrade mám 2 dotazy.

  1. Jak nyní funguje stahování souborů (když jej nechci rovnou zobrazit, ale stáhnout)? Dříve jsem měl:
...
$pdf->save(DOWNLOAD_DIR . '/', $file);
$this->presenter->sendResponse(new \Nette\Application\Responses\FileResponse(DOWNLOAD_DIR . '/' . $file . '.pdf'));
...

Ale nyní save() vypadlo a tím mi přestalo stahování fungovat.

  1. Po upgrade se mi přestaly zobrazovat HTML hlavičky a patičky. Tam došlo také k nějakým změnám?

Děkuji za rady

EDIT: Také jsem si všiml, že když projekt nainstaluju z PdfResponse-example, tak nefunguje javascript (nevyskočí dialogové okno pro tisk) tak jak je to v živé ukázce.

EIDT2: Tak na bod 1 jsem už přišel, takže nyní už mě tíží jen ty HTML hlavičky :-(

Editoval TOMeek (20. 5. 2013 10:50)

Honza Kuchař
Člen | 1662
+
0
-

@kbtm: Tam se mi nějak plete dohromady latte a syntax mPDF? Či, moc tomu kódu nerozumím, ale určitě bude lepší se zeptat zde.

@TOMeek: Jak jsi zprovoznil ten JS s novým mPDF? Vím, že to teď nefunguje… :-) Neudělal bys prosím fork s opravou jak odpověď na issue? V ukázce běží podstatně starší verze s podstatně starší mPDF. A ad hlavičky a patičky, je to čistě věc mPDF, PdfResponse do těchto věcí nijak nezasahuje. Tedy možná downgrade na nižší verzi mPDF…

kbtm
Člen | 22
+
0
-

Problém není v mPDF, vše souvisí s vlastností latte – ev. změny proměnných v includovaném souboru se nepřenesou do hlavního souboru šablony.

Pokud se místo „include/includeblock“ kod includovaného souboru přímo vloží do souboru šablony, je vše v pořádku – proměnnou lze měnit a používat v celé šabloně.
V tomto případě je možné makro {PAGENO} po zpracování odchytit (třeba) makrem „capture“ do proměnné a obsah této proměnné pak použít kdekoliv na stránce formuláře.

kbtm

Honza Kuchař
Člen | 1662
+
0
-

A proč jsi nepoužil toto? https://latte.nette.org/cs/tags#… :-)

buffus
Člen | 101
+
0
-

Lze nějak přednastavit při použití Pdfresponse pro Nette 2 v režimu Force file to display in a browser

public function actionPdf()
    {
        $template = $this->createTemplate()->setFile(APP_DIR . "/templates/myPdf.latte");
        $pdf = new \PdfResponse($template);
        $pdf->setSaveMode(PdfResponse::INLINE);
        $this->sendResponse($pdf);
    }
}

název souboru k uložení, když si uživatel (v prohlížeči inline otevřeném pdf) klikne v dolním, pod myší vyskakujícím Adobe Reader baru na disketu, že chce uložit kopii otevřeného pdf?

Teď to nabízí název „http___domena“, potřeboval bych do nabízeného názvu přidat hodnotu z proměnné (kterou mám v Presenteru i Latte dostupnou), ale nevím, jak ji dostat do nabízeného názvu. Ptám se jen, zdali to Pdfresponse nějak umí řešit a něco jsem přehlédl, pokud ne, nějak si poradím. Předem díky za radu.

Honza Kuchař
Člen | 1662
+
0
-

Obávám se, že PDF browser použije jako název poslední část URL nikoli údaje z HTTP hlaviček. Však otevři Firebug a zjistíš velmi jednoduše co se děje. Ale mam takovy pocit, že mi to V ISu funguje podle hlaviček. Tuším, že se mi choval jinak Chrome s interním prohlížečem a s Adobe Readerem.

Každopádně, kdybys udělal pomocí routerů URL ve tvaru /generuj/nazevTvehoPdf.pdf a data mu poslal POSTem, myslím, že dosáhneš, čeho chceš i pokud to ty hlavičky nebere.

buffus
Člen | 101
+
0
-

jj pravda, já to zkoušel uložit jen v Chrome… Firefox nabídne název k uložení podle $pdf->documentTitle = ... , což je vzhledem k tomu, že jde o intranetovou aplikaci, kde stejně používají všichni Firefox (a vlastně to pdfko ani v praxi ukládat nebudou, jde zejména o ukázat ho na monitoru a poslat tiskárně) přesně co potřebuji a více řešit nemusím. Díky.

Honza Kuchař
Člen | 1662
+
0
-

…teď jsem si všiml… Pokud posíláš data ke zpracování POSTem, v chrome to nejde uložit… (uložit generuje další http dotaz)

simPod
Člen | 383
+
0
-

Chci se zeptat, vytvářím PDF pomocí PdfResponse a chtěl bych ho po uložení poslat ještě emailem. Problém je, že když ho vytvořím pomocí $this->sendResponse($pdf);, tak mi to zároveň ukončí presenter, což nechci. Dá se to nějak obejít? Díky

Honza Kuchař
Člen | 1662
+
0
-
  1. Uložit pdf na disk/do proměnné, je-li malé
  2. Poslat mail
  3. $presenter->terminate($response);
simPod
Člen | 383
+
0
-

Můj kód je:

$pdf = new PdfResponse($template);
$pdf->pageOrientaion = PdfResponse::ORIENTATION_PORTRAIT;
$pdf->pageFormat = "A4";
$pdf->pageMargins = "10,20,20,20,0,0";

$pdf->displayLayout = "continuous";
$pdf->displayZoom = "fullwidth";

$pdf->outputName = './pdf/' . $id. '.pdf';
$pdf->outputDestination = 'F';
$this->sendResponse($pdf);

A PDF se vytvoří až po zavolání $this->sendResponse($pdf); ale v té funkci je terminate(). Zkoušel jsem terminate() na zkoušku zakomentovat, ale vypadá to, že PDF se vytvoří až po zavolání této funkce, bez jejího zavolání se nevytvoří.

Honza Kuchař
Člen | 1662
+
0
-

Mrknu na to koncem týdne…

simPod
Člen | 383
+
0
-

Já to zatím řeším zavoláním samostatné funkce s generací pdf přes curl, nenapadlo me, jak jinak. Díky tomu to vždy ukončí ten curl, ale původní presenter pokračuje v činnosti…

hranicka
Člen | 23
+
0
-

Pokud chcete PDF uložit do souboru a dále pokračovat v životním cyklu presenteru, nevolejte $this->sendResponse($pdf);, ale spíše postupujte takto nějak:

$pdf = new PdfResponse($template);
$pdf->outputName = "path/to/file.pdf";
$pdf->outputDestination = PdfResponse::OUTPUT_FILE;
$pdf->send($this->getHttpRequest(), $this->getHttpResponse());
// máme uložený PDF soubor a presenter dále pokračuje

Metoda PdfResponse::send() implementuje rozhraní IResponse, takže se jí musí předat příslušné parametry, i když se nevyužívají.

simPod
Člen | 383
+
0
-

já dříve používal https://componette.org/search/?…, ale teď jsem našel https://componette.org/search/?… a tam to jde bez problému viz příklad na stránce addonu

hranicka
Člen | 23
+
0
-

aha, díky, takže https://github.com/…/PdfResponse :-)

Editoval hranicka (1. 10. 2013 16:37)

Honza Kuchař
Člen | 1662
+
0
-

Ještě můžete využít toho, že je přístupné $pdf->getMPDF(), kde si můžete pdf souborů vygenerovat kolik chcete, či můžete využít jakékoli jiné API mPDF.

//EDIT: Otevřena issue: https://github.com/…nse/issues/5

pwnedko
Člen | 24
+
0
-

Prosím vás, mám takýto problém ked rozbieham tento plugin

Notice

Undefined index: BODY

Mal niekto niečo podobné ?

simPod
Člen | 383
+
0
-

nebylo by na škodu připojit kus kódu, kde ti notice vyskakuje

peter0212
Člen | 9
+
0
-

Zdravim! Chcel by so pouzit doplnok PDFResponse pre verziu Nette 2. Nakopiroval som triedu PDFResponse.php do adresaru libs a taktiez aj kniznicu mPDF. Ked sa pokusam ulozit vygenerovanu fakturu na moj localhost, tak to vygeneruje fakturu bez problemov. Problem vsak nastava ked sa snazim fakturu zobrazit priamo v prehliadaci, alebo ked sa ju pokusim stiahnut. Pri tychto dvoch moznostiach sa nestane nic.

Vygenerovane PDF, ktore ukladam na server a je funkcne, robim takto :

<?php
    public function actionToPdf()
    {
//        //šablona pro export do PDF
        $template = $this->createTemplate()->setFile(__DIR__ . "/../templates/Invoices/toPdf.latte");
        $template->value = 123;

        $pdf = new \PdfResponse($template);

        $pdf->documentTitle = "title";
        $pdf->pageFormat = "A4-L";

        $pdf->save(__DIR__ . "/../templates/");
    }
?>

Zobrazovanie v prehliadaci, alebo download suboru robim takto, bohuzial to nezobrazi nijaky PDF subor:

<?php
    public function actionToPdf()
    {
//        //šablona pro export do PDF
        $template = $this->createTemplate()->setFile(__DIR__ . "/../templates/Invoices/toPdf.latte");
        $template->value = 123;

        $pdf = new \PdfResponse($template);

        $pdf->documentTitle = "title";
        $pdf->pageFormat = "A4-L";

        $pdf->setSaveMode(\PdfResponse::INLINE);
        $pdf->send($this->getHttpRequest(), $this->getHttpResponse());

//        $this->sendResponse($pdf); //druha moznost ako som to skusal
    }
?>

Nevie mi niekto z Vas poradit, preco mi nefunguje zobrazovanie a stahovanie vygenerovanych suborov?
Dakujem.

Honza Kuchař
Člen | 1662
+
0
-

V kódu na první pohled chybu nevidím… Laděnka mlčí?! Btw. proč to tam nenasosneš Composerem?

peter0212
Člen | 9
+
0
-

Honza Kuchař napsal(a):

V kódu na první pohled chybu nevidím… Laděnka mlčí?! Btw. proč to tam nenasosneš Composerem?

Ladenka nehlasi nic, dokonca ani firebug. SKusal som to aj cez Composer, vysledok ten isty. :/ Napadlo ma ci by localhost to nemohol nejako blokovat. Skusal som uz aj ine verzie a stale, subor mi vygeneruje, a ulozi na server, ak zvolim tuto moznost. Bohuzial, PDF mi zobrazit v prehliadaci nechce.

Honza Kuchař
Člen | 1662
+
0
-

Prosím založ na to prosím issue na githubu, mrknu na to.

peter0212
Člen | 9
+
0
-

Dakujem za pomoc, vyriesil som to s pomocou kamarata. Chyba bola v tom ze som to volal Ajaxovo. Dakujem za Vas cas.

Honza Kuchař
Člen | 1662
+
0
-

:-) Prima! Zavírám issue.

Johny 5
Člen | 5
+
0
-

Zdravím,

vím, že budu vypadat jako lama, ale radši jako lama, než nevědět. Rád bych rozpohyboval PDFResponse. Ale vůbec mi to nejde. Stáhl jsem mPDF, PDFResponse, nakopíroval do lib, atd. A nemohu to rozeběhnout. Chtěl bych se zeptat na celý postup rozeběhnutí, co kam nakopírovat, co kde dopsat, přepsat, atd. Jako pro mne (lamu). :) Jinak proč nepoužiji Composer? Nevím, protože netuším jak to funguje, takže nevím jestli mi to pomůže… Jinak jsem zkoušel základní příklad, ahoj světe.

Děkuji všem za vzácné rady a omlouvám se, že obtěžuji pro někoho s tak triviálním dotazem.

romiix.org
Člen | 343
+
0
-

Popis inštalácie je na stránke doplnku. Composer v dokumentácií je – jkuchar/pdfresponse:dev-master.

Čo presne si spravil, aký výsledok si očakával a čo sa reálne stalo (zle)? Nenapísal si aký problém nastal.

Honza Kuchař
Člen | 1662
+
0
-

A instalace composer: https://doc.nette.org/…ces/composer

simPod
Člen | 383
+
0
-

Povedlo se někdy nekomu udělat, že ve vygenerovaném PDF nějaký blok nebude zalamován page-breakem, ale že zůstane celý a zobrazí se na další stránce?

Honza Kuchař
Člen | 1662
+
0
-

Jak přesně to myslíš? Nechápu to. Ale nebude odpovědí pomocí CSS?

simPod
Člen | 383
+
0
-

Aha, asi jo. Zkusil jsem page-break-inside: avoid; vypadá, že funguje. Díky

TomasHalasz
Bronze Partner | 79
+
0
-

Ahoj,

po aktualizaci na Nette 2.2.1 mi přestal fungovat export do PDF pomocí PDFResponse. Místo PDF jsem dostal HTML s chybou:

mPDF error: HTML contains invalid UTF-8 character(s)

Před aktualizací Nette to fungovalo bez potíží. Zkusil jsem ještě prázdnou šablonu a taky to hází stejnou chybu.
Takže jsem si upravil PDFResponse.php takto:

/**
* Build final pdf
*/
private function build() {
    if (empty($this->documentTitle)) {
        throw new Exception("Var 'documentTitle' cannot be empty.");
    }
    ...
    ...
    ...
	$html =  iconv("UTF-8","UTF-8//IGNORE",$html); //T.Halasz - remove of incorrect utf-8

Otázka je, nevadí ta má úprava něčemu? Nebo jsem něco při aktualizaci Nette přehlídnul a má to být úplně jinak ?

díky moc za pomoc :-)

hranicka
Člen | 23
+
0
-

@TomasHalasz Kdyby byly problémy, můžeš zkusit můj fork fungující s Nette 2.2 https://bitbucket.org/…response.git

lukas.sirhal
Backer | 20
+
0
-

Ahoj mPDF mi hází tuto chybu na produkčním serveru
mPDF error: IMAGE Error (http://lokalno.cz/…ogo_dark.png): Could not find image file

k tomu obrázku se na adrese normálně dostanu.
PDF rendruji pomocí latte šablony a obrázek v šabloně mám takto:

<div id="pdfLogo">
	<img src="{$basePath}/images/default/logo_dark.png" />
  </div>

nevíte čím by to mohlo být? na serveru jsou práva 770
a pdfResponse mám ve složce VENDOR stejně tak i mpdf

simPod
Člen | 383
+
0
-

jiné obrázky to bere? Jestli třeba není corrupted…

lukas.sirhal
Backer | 20
+
0
-

simPod napsal(a):

jiné obrázky to bere? Jestli třeba není corrupted…

Teď jsem to zkoušel i s jiným obrázkem a to samé … můžete mi někdo říci jak by měli být nastavené práva na souborech? Ono je to na produkčním serveru u mě na locale to funguje OK

Honza Kuchař
Člen | 1662
+
0
-

me se tam nelibi to baseUri. Nemela by tam byt spis relativni adresa od cwd nebo absolutni adresa na firesystemu. Teoreticky by to melo fungovat i s URL, ale to jde v nastaveni PHP zakazat.

Andre
Člen | 24
+
0
-

Je možné rozchodit generování PDF přes tento addon mimo presenter v modelu? Konkrétně mi jde o to, že bych chtěl mít funkci generateInvoice, kterou bych chtěl volat v různých prezenterech, takže by bylo žádoucí ji mít jako model. Problém je ale s templatem, protože

$template = $this->createTemplate();

Není možné zavolat mimo presenter. Nenapadá vás, jak to vyřešit?

castamir
Člen | 629
+
0
-

Udělej si komponentu (novou třídu dědící od Nette\Application\UI\Control), která tuto metodu má.

Může to vypadat nějak takto:

Komponenta

namespace App;

use Nette\Application\UI\Control;

class PdfControl extends Control
{

    /** @var array of events */
    public $onSuccess = [];



    public function processForm(Form $form, $values)
    {
        // proccess form
        $template = $this->createTemplate();
		$template->render(path/to/template/file);

        $this->onSuccess($template);
    }



    protected function createComponentForm()
    {
        $form = new Form;
        $form->onSuccess[] = $this->processForm;

        return $form;
    }
}

Továrnička na komponentu

namespace App;

interface PdfControlFactory
{
    /**
     * @return PdfControl
     */
    function create();
}

Registrace továrničky v konfiguráku

# Nette 2.2 syntax
- implement: App\PdfControl

Použití v presenteru

/** @var \App\PdfControlFactory @inject */
public $pdfControlFactory;



protected function createComponentPdfControl()
{
    $control = $this->pdfControlFactory->create($this->section);

    // send PDF
    $control->onSuccess[] = function ($template) {
       $response = new Joseki\Application\Responses\PdfResponse($template);
       $this->sendResponse($response);
    };

    return $control;
}

Editoval castamir (13. 10. 2014 8:24)

Honza Kuchař
Člen | 1662
+
0
-

Pokud to nejde primocare, zaloz na to issue, nebo posli pull-request. Nedavno jsem neco podobneho resil s Eciovni a byly tam podobne problemy…

lukas.sirhal
Backer | 20
+
0
-

Ahoj, můžu se zeptat jestli mají fungovat styly v generovaném PDF zapsané přímo v latte.
něco jako

{extends none}
<style type="text/css"></style>
<table> ..... </table>

jde mi o to že při takovém to zápisu mi nefungungují marginy ani paddingy nebo zda nemají fugnovat vůbec, ale to se mi nezdá. V composeru mám nyní verzy mpdf 5.7.2 a pdfResponse 2.*

lukas.sirhal
Backer | 20
+
0
-

Ahoj a mám ještě jednu otázku při generování pdf dostávám tuto hlášku
<B>mPDF error: </B>IMAGE Error (http://www.lokalno.cz/…20553556.png): Could not find image file

a v šabloně pro PDF mám tento kód

<style>
    body{
        {ifset $frame}
            background: url('_data/frame/{!$frame}') no-repeat;
        {else}
            background-color: #fff;
        {/ifset}
        font-family: Arial, Helvetica, sans-serif;
    }
</style>

na localu mi to vsechno funguje OK, ale na produkčním mi mPdf vyhazuje tuto chybu, nevím si s tím rady už jsem zkokušel i růzmě prohazovat cesty a nic
Když mám v šaboně toto

<img id="logo_lokalno" src="images/logo_dark.jpg" alt="Logo lokálno"/>

tak se obrázek zobrazí v pohodě
díky za návrhy

Honza Kuchař
Člen | 1662
+
0
-

Mozna chyba opravneni?

Honza Kuchař
Člen | 1662
+
+1
-

Pouziva jeste nekdo verzi pro Nette 0.9? Je třeba udežet tu starou verzi na GitHubu?

Čamo
Člen | 786
+
0
-

PHP 7 vyhadzuje chybu kôli mpdf. Existuje nejaké riešenie tohoto problému???

ic
Člen | 430
+
0
-

Třeba by šla najít nějaká jiná PDF knihovna. Teď jsem přednedávnem použil dokonce javascriptovou pdf knihovnu jsPDF ( https://parall.ax/…s/jsPDF.html ) a fungovala perfektně. Ale pokud je potřeba serverové generování, tak tady taky používám mPDF, tak nevím.

Honza Kuchař
Člen | 1662
+
0
-

Nechceš pomoci implementovat driver pro PdfResponse pro https://github.com/…nse/issues/9 Vzhledem k tomu, že na to již existuje obálka v pro PHP, nebude to určitě žádný problém.

Editoval Honza Kuchař (19. 5. 2016 22:32)