Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: ZAJDAN 23. 10. 2015, 16:18:04
-
Ahoj,
do proměné $svg jsem ziskal string, ketry budem obsah nasledujici souboru vytvořeného v php
$file=tempnam('/var/www/web1/pdf/tmp/', 'model_'.date(Y.m.d).'_').'.svg';
$handle = fopen($file, "w");
fwrite($handle, $svg);
fclose($handle);
toto fachčí, soubor se vytvoří a obsahuje to co má
chtěl bych teď tento soubor ve stejném php kodu použít jako zdroj v <img>
<img src= ". $file . ">
lze v tomto případě proměnou $file použít jako cestu k souboru?
-
Tahle rozhodně ne...
-
chtěl bych teď tento soubor ve stejném php kodu použít jako zdroj v <img>
<img src= ". $file . ">
lze v tomto případě proměnou $file použít jako cestu k souboru?
Nelze. Musíš použít cestu pro virtuální prostředí webového serveru. Často je však výhodnější generovat obsah dotyčného souboru až ve chvíli přístupu - nemusí pak fyzicky na disku vůbec existovat, resp. stačí, když bude v cache.
-
chtěl bych teď tento soubor ve stejném php kodu použít jako zdroj v <img>
<img src= ". $file . ">
lze v tomto případě proměnou $file použít jako cestu k souboru?
Nelze. Musíš použít cestu pro virtuální prostředí webového serveru. Často je však výhodnější generovat obsah dotyčného souboru až ve chvíli přístupu - nemusí pak fyzicky na disku vůbec existovat, resp. stačí, když bude v cache.
generovat obsah souboru, tak aby se fyzicky na disk vubec neulozil, by se mi zamlouvalo nejvic...nemas prosim nejakej priklad, kde bych se mohl inspirovat?
-
v pripade promene $svg je obsah souboru v podstate jen v pameti
az vise uvedenym zapisem 'fwrite' ho ulozim do souboru
ale jak do <img src=" "> nandat ze zdrojem je obsah promene $svg a ze se to ma reprezentovat jako datovy typ svg, na to jsem neprisel
-
co potrebujes tak to je:
- v prvnim skriptu jen vypsat <img src="/obrazek.php?date=YYYY-mm-dd">
- v druhem skriptu udelat ten obrazek a poslat ho na vypis. v html sice bude obrazek.php, ale pomoci hlavicek prohlizeci reknes, ze je to svg
-
generovat obsah souboru, tak aby se fyzicky na disk vubec neulozil, by se mi zamlouvalo nejvic...nemas prosim nejakej priklad, kde bych se mohl inspirovat?
Tu část s generátorem dáš do dalšího skriptu, ke kterému uděláš REST API s příslušným přesměrováním od webserveru. Je však nutné kód 'model_'.date(Y.m.d).'_.svg'
upravit na něco, z čeho se požadovaný SVG dá vygenerovat a přitom nemusel URL složitě parsovat. Třeba i takhle jednoduše:
<img src="/model/$date">
Vzhledem k tomu, že to bude asi nějaký graf denního provozu, slovo "model" doporučuji nahradit něčím vhodnějším, například "graf". Nemám dostatek informací na to, abych ti mohl navrhnout lepší název.
Několik dalších řešení:
http://www.sitepoint.com/add-svg-to-web-page/ (http://www.sitepoint.com/add-svg-to-web-page/)
Do HTML5 můžeš SVG vkládat i inline, což by mohlo být v daném případě úplně nejjednodušší.
-
ve skutečnosti jde o tento proces:
(http://picpaste.com/pics/pass_svg-gIHA7l3j.1445614361.png)
to svg předávám takto,protože se odesílá jeho aktualní stav změněný pomocí interakce uživatele na webu
na generovaní PDF jsem použil knihovnu mPDF
-
http://picpaste.com/pics/pass_svg-gIHA7l3j.1445615268.png
-
Pokud ten obrázek není moc velký, můžeš použít data url, vygeneruješ "<img src="data:image/svg+xml;base64," a pak k tomu přidáš ten svg obrázek zakódovaný pomocí base64. Nebudeš muset ten obrázek nikam ukládat ani ho generovat v nějakém zvláštním kódu.
-
- v mém případě je to svg hodně objemné
- další bariera je to, že já ho potřebuju předat PHP knihovně mPDF, která ho dostane do výsledného PDF
běžné hodnoty proměných se tam takto dostanou, ale string obsahující svg/xml to nevyrenderuje ať se to vloží do jakéhokoliv tomu určenému tagu
-
pokud to neni lepeni na nejakym levnym hosting a mas tu moznost tak doporucuju vyprdnout se na cely mpdf a pouzit wkhtmltopdf. usetris si obrovskou spoustu prace.
-
ohledně toho wkhtmltopdf nemáš čirou náhodou zkučenost s podobným cílem jako já?
předat svg k rendrovaní PDF pomocí PHP proměné
-
mimo http://wkhtmltopdf.org/ existuje ještě http://phantomjs.org/
mpdf moc nedoporučuju, je s tím ve výsledku dost práce a jsou potřeba kompromisy, protože to prostě nefunguje dokonale (i když je to asi nejpokročilejší knihovna pro daný účel a PHP)
vložení svg do html je samostatný problém, který by měl tazatel zvládnout nezávisle na generování pdf, jinak v tom bude plavat
-
je to škoda, protože všechno ostatní se mi s knihovnou mPDF dělá velmi dobře a vše funguje, jen ne to předání svg přes php proměnou
-
Zajdan:
- zkousel jsi to tam fouknout pres base64?
- kdyz to neposilas do pdf ale jako html na vystup tak to vidis v prohlizeci cajk a problem ma jen mpdf?
- jak vypada vysledek kdyz to posles do pdf? je problem jen v tom obrazku?
Ondrej Nemecek: osobne povazuji tcpdf za pokrocilejsi, ackoliv pracnejsi.
-
Zajdan:
- zkousel jsi to tam fouknout pres base64?
- kdyz to neposilas do pdf ale jako html na vystup tak to vidis v prohlizeci cajk a problem ma jen mpdf?
- jak vypada vysledek kdyz to posles do pdf? je problem jen v tom obrazku?
Ondrej Nemecek: osobne povazuji tcpdf za pokrocilejsi, ackoliv pracnejsi.
zkusil jsem:
<img src='data:image/svg+xml; <svg width='100' height='100'> <circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' /></svg> ' />
<img src='data:image/svg+xml; base64codeHere ' />
<img src='data:image/svg+xml; $svg ' />
mpdf nezpracuje ani jeden takovyto zpusob predani a ve vyslednem pdf je jen ikonecka pro 'neexistujici' zdroj
-
Tak si to po sobě alespoň přečti. Jak asi vyhodnotíš ty apostrofy?
-
A u toho druhého mu musíš ten encoding samozřejmě říct. Např. u PNG je to
src="data:image/png;base64,DATA"
-
Jendo nemej strach, ze jde o base64 jsem do zapisu uvedl a apostrofy tam mam u beznych obrazku standadne a funguje to....s jisteho duvodu je tam musim mit ,ale nechci to tady zbytecne rozvadet o dalsi tema
-
Jendo nemej strach, ze jde o base64 jsem do zapisu uvedl
Ja nevim, nebylo by dobre sem postnout ten kod, co ti skutecne nefunguje, misto toho, aby sis vymyslel nejaky jiny??? Uz tomu fakt nerozumim.
apostrofy tam mam u beznych obrazku standadne
Eh?
-
Proč místo značky img nepoužiješ značku svg?
<!DOCTYPE html>
<html>
<body>
<svg width='100' height='100'>
<circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' />
</svg>
</body>
</html>
-
zkusil jsem:
<img src='data:image/svg+xml; <svg width='100' height='100'> <circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' /></svg> ' />
no a tady mas s tema apostrofama evidentne chybu. protoze ten apostrof za width= ti uzavre ten co je pred data:image
-
No, hlavne v parametre tagu nemozes mat dalsi tag... (v img src nemozes uviest <svg>), jedine ze by si pouzil CDATA (ak sa bavime o xhtml). Do SRC ma ist URI, pripadne este data v base64.
Mas tieto moznosti:
1. ako niekto spominal, v src uviest nejaky skript, napr. obrazok.php a tomu predat ako argument nejake id alebo nejaky string, na zaklade ktoreho bude schopny obrazok vygenerovat. Takze id zdroja, alebo rovno data toho obrazku. Implementacne relativne jednoduche a riesi to za teba vela veci (lahko nastavis/zrusi cachovanie, ak nema uzivatel zapnute obrazky, nedojde ani k requestu, nezdrziava load stranky -- generovanie obrazku sa robi v inom requeste). A ako vystup vies pouzit bud nejaky binarny format alebo aj SVG, musis len setnut spravny content-type.
To by vyzeralo cca takto:
HTML:
<img src="obrazok.php?id=123" />
Kod na strane servra:
<?php
Header("Content-Type: image/svg+xml");
$id=$_GET['id'];
if ($id == 1) {
// nejako vytvorime obsah, pravdepodobne pouzijeme nejaku libku, v tomto priklade to dame natvrdo. data vytiahneme odnekial podla idcka, pripadne tam mozme mat rovno string s datami
$svg = "<svg width='100' height='100'><circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' /></svg>";
}
else {
$svg = "<svg width='100' height='100'><circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='blue' /></svg>";
}
// vratime SVG.
echo $svg;
?>
2. pouzit zdrojove XMLko + xslt na jeho transformaciu na SVG. Idealne ak mas jednoduchu sablonovitu logiku na vygenerovanie obrazku a vies mu dat zdrojove data v xml. Prikald: http://edutechwiki.unige.ch/en/XSLT_to_generate_SVG_tutorial
3. Vlozit priamo vygenerovany obrazok v base64, napr takto: http://danielmclaren.com/2008/03/embedding-base64-image-data-into-a-webpage. Vhodne len pre male veci, ktore nechces cachovat. Takisto zdrzuje load stranky, na rozdiel od prvych dvoch rieseni. Mozes narazit na problem pri niektorych browseroch.
-
proč použávám v tomto případě (mPDF) apostrofy?
protože jsem zvolic cestu html zápisu
standardni funkcni zapis, kde telo promene je obaleno do apostrofu je takto:
$html = ' <div id="pieces"> pieces: </div> ';
$mpdf -> WriteHTML($html);
$mpdf -> Output('pdf/test.pdf', 'I');
problem nastane pokud do html vsadim php promenou (do PDF se nevyrenderuje hodnota promene):
$html = ' <div id="pieces"> pieces: $pieces </div> ';
pokud zapis provedu jinak a to nahradou apostrofu za uvozovky (hodnota promene se vyrenderuje spravne):
$html = " <div id=\"pieces\"> pieces: $pieces </div> ";
ale vsimnete si ze musim escapovat vnitrni uvozovky
a to je duvod proc pouzivam uvnitr apostrofy....nemusim pak escapovat:
$html = " <div id='pieces'> pieces: $pieces </div> ";
-
a to je duvod proc pouzivam uvnitr apostrofy....nemusim pak escapovat:
Tak používej uvozovky bez escapování:
$pieces = 20;
$html = <<<EOT
<body>
<div id="pieces">pieces: $pieces</div>
</body>
EOT;
-
proč použávám v tomto případě (mPDF) apostrofy?
protože jsem zvolic cestu html zápisu
standardni funkcni zapis, kde telo promene je obaleno do apostrofu je takto:
$html = ' <div id="pieces"> pieces: </div> ';
$mpdf -> WriteHTML($html);
$mpdf -> Output('pdf/test.pdf', 'I');
problem nastane pokud do html vsadim php promenou (do PDF se nevyrenderuje hodnota promene):
$html = ' <div id="pieces"> pieces: $pieces </div> ';
....................
Je ještě čtvrtá varianta, jak to napsat, a nemusí se nic eskejpovat:
$html = ' <div id="pieces"> pieces:' . $pieces . '</div> ';
-
hoši moc díky!
ad progman)
zkouším tu variantu 1.) kde do src uvedu url na php scrip...pokud to svg v tom scriptu necham natvrdo zapsane, tak jak jsi to demonstroval Ty
...funguje to,
ale nedaří se mi to pokud to svg tam předám takto:
<?php
Header("Content-Type: image/svg+xml");
$id = $_POST['id'];
$post_data = $_POST['structureSVG'];
echo $post_data;
?>
když se podívám na response co vrací server, tak je tam očekávaný svg/xml string, který jsem získal ajaxem z původní stránky
-
hlavicky u toho svg neresis?
-
hlavicky u toho svg neresis?
abych pravdu řekl, tak jak to leží na webu, tak v takovém stavu to vemu->odešlu ajaxem a v php scriptu zachytím pro další zpracování,
když se na konci tohoto procesu podívám na vnitřní struktutu toho SVG, je stejná jako na začátku (zobrazitelný svg obrázek), proto v průběhu toho procesu hlavičky neupravuji
-
když se nad tím co se děje zamyslím, obávám se, že v bodě kdy si PHP script generující PDF říká o zdroj <img>, tak ho nedostane,
nejlépe to půjde vidět na přiloženém schématu:
http://picpaste.com/pics/pass_svg_process-01-01-71Hug0tD.1445955633.png
1) submit vyvolá dvě akce
a) na onclick zavolá js/ajax funkci (tam se získá SVG string a pošle na url s PHP scriptem)
b) odešle form na php script generující PDF
2) php script generující PDF si pro daný <img> se src odkáže na php script předávající data obrázku
a tady v tom bodě 2 pravděpodobně proměná ty data mít nebude
-
V manuálu mPDF (http://mpdf1.com/manual/index.php?tid=245) je přímo ukázka:
$mpdf->myvariable = file_get_contents('alpha.png');
$html = '<img src="var:myvariable" />';
$mpdf->WriteHTML($html);
Možná by bylo dobré jasně napsat už v 1. příspěvku, co přesně řešíš. Já si musel přečíst celou diskuzi a přesto si nejsem jistý, že jsem to pochopil správně (třeba si jen stojím na kabelu):
- Z klienta si chceš poslat formulář + SVG obrázek a výsledkem má být PDF.
- Z nějakého důvodu posíláš SVG odděleně přes Ajaxový request - v tom případě potřebuješ řešit souběh, např. nejdřív počkat na dokončení toho Ajaxu a až pak submitnout zbytek formuláře, jinak se ti ten hlavní submit může na serveru vykonat dřív a tedy by neměl k dispozici to SVG.
- Na straně serveru vytváříš HTML řetězec, ve kterém mají být data z formuláře a hlavně to SVG. Tento HTML řetězec ještě na straně serveru chceš použít do mPDF knihovny, ze které má vypadnout PDF soubor.
Nebo je to celé ještě jinak?
-
Diky za reakci....
Cela ta komplikovanost je v tom, ze to svg je interaktivni a je potrebuju odeslat jeho aktualni stav( tak jak ho zmenil uzivatel), proto to posilam ajaxem....poslu DOM strukturu svg, ktera je v pameti.....pres php by me to vzalo fyzickej stav/vychozi co je ulozen na disku....nebo se mylim?