[addon pdfresponse] PdfResponse
- TOMeek
- Člen | 64
Po upgrade mám 2 dotazy.
- 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.
- 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
@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
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
- buffus
- Člen | 101
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
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
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
…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)
- Honza Kuchař
- Člen | 1662
- Uložit pdf na disk/do proměnné, je-li malé
- Poslat mail
$presenter->terminate($response);
- simPod
- Člen | 383
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ří.
- hranicka
- Člen | 23
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
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
aha, díky, takže https://github.com/…/PdfResponse :-)
Editoval hranicka (1. 10. 2013 16:37)
- Honza Kuchař
- Člen | 1662
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
- peter0212
- Člen | 9
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
V kódu na první pohled chybu nevidím… Laděnka mlčí?! Btw. proč to tam nenasosneš Composerem?
- peter0212
- Člen | 9
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.
- Johny 5
- Člen | 5
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
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.
- TomasHalasz
- Bronze Partner | 79
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
@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
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
- lukas.sirhal
- Backer | 20
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
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
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
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
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
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
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
Pouziva jeste nekdo verzi pro Nette 0.9? Je třeba udežet tu starou verzi na GitHubu?
- ic
- Člen | 430
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
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)