PHP generálta vektorgrafikus kép mérethelyes vágása

 ( plt | 2018. február 12., hétfő - 11:40 )

Egy hobbi weboldalamon generálok vektorgrafikus képeket, ahol cél, hogy a kinyomtatott változat mérethelyes legyen.
Nehézség a feladatban, hogy a képek egy 210mm*420mm-es téglalapba férnek bele, azaz széltében A4, hosszában A3 a méretük.
Elvileg egy A4-es nyomtatón kinyomtathatóak lennének, maximum két darabban.

Jelenleg a képeket SVG-ben és PDF-ben tudom előállítani, de egyiknél sem tudom elérni, hogy a nyomtató darabolja, és ne átméretezze a képet.
A görbék generálása összetett, így az nem járható út, hogy eleve A4-es méretre vágva generáljak részgörbéket. Valamint, ha valakinek van A3-as nyomtatója, attól sem venném el a lehetőséget, hogy az egészet egyben kinyomtathassa.

Innentől érdekelnének a megoldási ötletek. (Ha lényeges, a pdf generálásához Tcpdf és Fpdf könyvtárakat használok.)

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Szerintem muszáj lesz memóriában szétvágni azt a képet. SVG-ben létezik olyan, hogy a határoló dobozt a tartalomtól kisebbre veszed, opcionálisan fehér négyzetet tehetsz a lelógó rész fölé és végleg eltűnik. Ezt eljátszod 2-szer, egyszer az egyik, másodszor a másik felét takarod le, és megvan a két képed. Amúgy meg biztos ki lehetne számolni egyenként minden görbére, hogy a két oldal határán épp hol érne véget, biztos szebb lenne így, de mindegy.

Ezután lehetőségek:
1. https://www.w3.org/TR/2004/WD-SVG12-20041027/multipage.html
2. Tedd bele egy 2-oldalas PDF-be azt a 2 db SVG-t.
3. Két SVG-t tegyél ki a HTML oldalra, query stringben add át, hogy épp melyik felét kéred a PHP-tól. De kétszer fogod elvégezni a számítást szerver oldalon. Vagy szerver oldalon egyszer számolsz, és JS-ben csinálod a kitakarásos trükköt.

Matematikailag ki lehetne számolni a görbék szétvágását, de az nagyon güris lenne.
A kitakarás jó ötlet, köszönöm! Azt már most is el tudom érni, hogy egy A4-es pdf-be csak annyit látok a görbékből, amennyi elfér az A4-es oldalon.
Ezek után, ha eltolom, és a következő oldalon meg a másik felét mutatom, az jó.
Nem szép megoldás, de ez legalább működhet.
A csúfsága, hogy A3-as nyomtató esetén is rákényszerítem a kétszeri nyomtatásra, vagy csinálok egy A3-as verziót is.
Reméltem, hogy van olyan kód PDF-ben, ami kötelezi a nyomtatót, hogy a szélességet ne változtathassa - legalábbis defaultban ne.

A PDF teljesen oldal-orientált, nagyon aprólékosan minden oda van pozícionálva valahova, amit neked nem fog semmilyen printer okosan transzformálni.

Egy esetet kivéve. Ha legenerálod az A3-at, akkor azt valaki majd ki tudja nyomtatni szépen A3-ban. De ha A4 nyomtatójuk van, akkor egyrészt annak muszáj margó nélkülinek lennie, másrészt a kliens programnak tudnia kell ezt a fajta szétosztást. De én pl. a saját nyomtató beállításaimban ilyet nem látok, és a nyomtatóm is hagy némi margót. Tehát hol fog működni, hol nem. Ha már van margó, akkor a 2xA4-es megoldás már egyszerűen nem úgy néz ki, mint az 1xA3-as.

"Ha legenerálod az A3-at, akkor azt valaki majd ki tudja nyomtatni szépen A3-ban."
Kivéve akkor, ha az A3 lapon a margókon kívül kéne nyomtatni, mert akkor is összenyomott lesz az egész, ha arányosan akarja kinyomtatni, vagy lesznek lelógó részek.

A lényeg: ha A3/A4-re tervezünk ÉS desktop nyomtatásra, akkor mindenképpen hagyni kell margót.
Sajnos nyomtatótól függ, hogy mekkora a margó, a nyomtatódriver tartalmazza ezt az információt.

A PDF kliens feladata eldönteni azt, hogy mit küld ki a nyomtatóra. Az Adobe képes tile-olni a nagyméretű dokumentumokat:
https://helpx.adobe.com/acrobat/kb/print-posters-banners-acrobat-reader.html

Ezt a problémát nem generálói oldalon kell megoldanod szerintem.

Ez tök jó. De ha tényleg lapszéltől lapszélig ér a rajz, akkor a margók miatt 2 helyett 4 darab A4-es lapra fog kiférni a cucc. Azt is lekezeli, vagy annyival összenyomja?

Beállíthatod, hogy mennyi legyen az overlap, százalékban. Nyomtat a papírra vágójeleket, aminek a segítségével pontosan levághatod a margókat az összeillesztéshez.
Persze ekkor tényleg 4 lap kell hozzá, de ilyen ez a desktop nyomtatás. Ez nem nyomdatechnika, sose feledjük el.

Esetleg nézd meg a pdfposter-t. Parancssoros, és ha jól rémlik, vágójeleket is rak...

----------
Were antimatter present, its detection would be quite simple and straightforward. The most rudimentary detector suffices: simply place it down and wait. If the detector disappears, antimatter has been discovered - get out fast!

Megszületett a megoldás, már amennyire lehetséges.

1 - Megpróbáltam HTML oldalba betenni képként a kinyomtatandó ábrát, mivel a HTML oldalt nyomtatáskor képes darabolni a böngésző. Az eredmény az, hogy az oldalt tényleg darabolja, de az oldalon található képeket nem tudja így elvágni. Nem ez lett a megoldás.

2 - Konvertáltam PS-be a PDF fájlokat. Reméltem, hogy a PS fájl már a nyomtató számára tartalmaz oldalméret információkat is. Lehet, hogy postscript nyomtató esetén ez így is van, én csak egy olcsó epson printerrel próbálkoztam, és ott sajnos nem ez a helyzet. A papír méretét mindenképpen a nyomtatáskor megadott oldalbeállításból veszi. Ha nyomtatáskor megadom, hogy ez egy A3 hosszúságú A4 szélességű papír, amire nyomtatok, akkor már képes egyben kinyomtatni.
A PS formátum előnye a PDF-fel szemben, hogy már nem kerül átméretezésre. Míg egy túlméretes PDF ábrát átméretez a nyomtató szoftver, hogy minden megjelenjen a papíron - az üres rész is -, addig PS esetén a kilógó részek egyszerűen lemaradnak.
Ez nagyon fontos, mert így a konkrét nyomtató margóitól függetlenül biztosítani lehet, hogy a kinyomtatott ábrán is 1cm legyen az 1cm!!!

Tehát összegezve PS formátumban lehet ilyen méretstabil ábrákat nyomtatni, de a kliensnek annyi teendője mindenképp van, hogy a nyomtatásnál megadja a szükséges (A4-esnél nagyobb) egyedi papírméretet.

A PDF sem kerül átméretezésre. Abban is lehet fizikai méreteket definiálni, én A4-es méretet szoktam. Másrészt ha mégis átméreteződik, az már nem a PDF hibája, hanem a PDF feldolgozó szoftveré (readerprogramok), vagy a nyomtatódriver, azokban kell beállítani, hogy 1:1-ben nyomtassa, margók nélkül, ne méretezze át.


„Pár marék nerd-et leszámítva kutyát se érdekel már 2016-ban a Linux. Persze, a Schönherz koliban biztos lehet villogni vele, de el kéne fogadni, ez már egy teljesen halott platform. Hagyjuk meg szervergépnek…” Aron1988@PH Fórum

Igen, a PDF-nél megadható a papírméret. Az pedig döntés kérdése, hogy ha a nyomtató nem azonos papírmérettel dogozik, akkor levágódjon a kieső rész, vagy átméreteződjön az oldal. Erre vonatkozólag nem találtam paraméterezési lehetőséget. Az én nyomtatóm átméretezi, és ez nekem nem jó.
A PS fájl elvileg már a nyomtatónak küldött konkrét nyomtatási parancsokat tartalmazza, míg a PDF, még csak a forrást mérethelyesen leíró dokumentum. Gondolom, ezért lehetséges, hogy a PDF-et még átméretezi a nyomtatóm, míg a PS-t már nem.
Az oldalméretet azonban továbbra sem értem. Ha a PS a nyomtató által értelmezett parancsok sorozata, akkor benne kellene lennie a lapdobásnak is, és azt nem egy külön nyomtatási opcióból kellene kiszámolnia a nyomtatónak. Azt sem tudom, hogy egy postscript nyomtatónál ez hogyan működik? PS fájl nyomtatása esetén ott is külön meg kell még adni a nyomtató papírméretét, vagy ezt a PS fájl már tartalmazza, és csak az én buta nyomtatóm miatt kell csak újra megadni azt.

Már régen olvastam ilyen dolgokról, de amire emlékszem (tévedés jogát fenntartom):

A PS egy oldalleíró nyelv, azaz azt írja le, hogy egy teljes oldal hogy néz ki. Az egyes gyártók nyomtatói, amelyek ismerik a PS nyelvet különböző paraméterekkel rendelkeznek. Például: margók, felbontás, méret. A PS leírja, hogy egy oldalra minek kell kerülnie. A nyomtatóban a PS értelmező feldolgozza a kapott adatokat, kiszámolja, hogy pontosan hova kerülnek az egyes elemek, generálja az oldalt, és a showpage parancs hatására kinyomtatja az egész oldalt. Ha nagyobb a margó, akkor arányosan kisebbek lesznek egyes elemek. Ha kisebb a margó, akkor arányosan nagyobbak lesznek az elemek.

A PDF is egy teljes oldalt ír le, csak nem ascii, hanem bináris formában. Aminek eredménye például a kisebb fájlméret. Tehát elvileg pont ugyanúgy kell „működnie” mint a PS-nek. Azaz ennél is az a helyes működés, hogy ha szükséges, akkor átméretezi a képet. Mivel a PS ascii formátumú, így gondolom egyszerűbben megoldható, hogy a nyomtató módosítsa az oldal kinézetét.

Probléma:

1. Ha az oldal látogatói mind olyan nyomtatóval rendelkeznek, mint amilyen neked is van, akkor náluk is úgy fog kinézni a nyomtatás eredménye, mint nálad. Ezt a követelményt nem egyszerű teljesíteni. Ha más gyártó (és ezzel más PS értelmező) is szóba kerülhet, akkor az eredmény eltérő is lehet.

2. Rengeteg nyomtatóban nincs PS értelmező. Ilyenkor a printer driver dolga a PS-et a nyomtató számára emészthető formára konvertálni. Semmi sem garantálja, hogy mindegyik PS értelemező ugyanúgy fogja kezelni a problémát.

Általánosan működő megoldás az lehet, hogy saját nyomtatás opciót adsz az oldalhoz, és ott a nyomtatás előtt ki kell választani, hogy A3-as, vagy A4-es nyomtatón akarja kinyomtatni. Azaz te magad elkészíted A3-as formátumban a pdf fájlt, amikor minden egy oldalon van, illetve az A4-es formátumban a kétlapos változatot is. Ez utóbbihoz már ajánlották a pdfposter programot.

Ha probléma megoldását az oldal látogatójának nyomtatójára vagy számítógépre bízod, akkor nem tudsz semmit sem garantálni.

Ha a pdfposter nem tetszik, akkor a „pdf tiling”-ra keress rá.

Ez elszomorít. :(
Ezek szerint nekem az a bináris forma kellene, amit a nyomtatónak küld ki a driver, és akkor azt kellene nyomtatótípusonként letölthetővé tennem, ami elég járhatatlan útnak tűnik. Ráadásul ezek szerint a postscript nyomtatók közvetlenül a PS fájlt kapják meg, azaz nincs tovább. A végső kialakult kép nem elérhető kívülről.
Maradhat a fix A4-es darabolás, amit már PHP-ból is meg tudok csinálni, csak szerettem volna egy kényelmesebb utat kínálni. Úgy tűnik, ez nem fog menni.
De azért az nagyon meglep, hogy nincs egy általános, méret alapú leírónyelv, amit a nyomtatónak nem áll jogában átméretezni. Ez akkor is jó lenne, ha bitmap alapú lenne, csak legyen mérettartó. Tényleg a való életben sehol nem cél a kinyomtatott ábra eszközfüggetlen mérettartása?

A nyomtatónak nem áll jogában átméretezni a PS-t. Az más kérdés, hogy nem tud például egy A4-es oldal 100%-ára nyomtatni, ez nem szoftveres dolog, technológiai probléma. A desktop nyomtatás még mindig nem nyomda.

De, a valós életben sokszor cél a mérettartás, például sablonok nyomtatásánál, vagy fotónyomtatásnál. Fotónyomtatók közül vannak jó A3-mas borderless fotónyomtatók, de mondjuk az áruk alulról közelíti a 400 dollárt (ami amúgy nem is sok érte, csak nem a 80 dolláros otthoni desktop nyomtatókról van szó).
Például: https://epson.com/For-Home/Printers/Photo/Expression-Photo-HD-XP-15000-Wide-format-Printer/p/C11CG43201

Persze ezzel nem is 4-5 forintért nyomtatsz oldalanként.

Illetve vannak a plotterek, ha nagyobb méretű ábrákat kell kinyomtatni. (A plt nick miből jött?)

részben off, látva, hogy a .ps sem ment meg a nyomtató szabad értelmezésétől: ha azt akarod elérni, hogy ne kelljen a felhasználónak a nyomtató beállításait megadni (lapméret, margó), kérdésem, hogy mennyire széles a felhasználói közönség? hobbit írtál, nagyon másik irányból érkeztem hasonló problémához, és kevés, fix felhasználóm van, ezért nyomtató programot írtam, parancssoros, .net alapú, nem kérdez, nem margózik, ami ráfér a lapra, azt nyomtatja, a te kérdéskörödben nem teszteltem, a fő kérdés, hogy mennyire megoldható, hogy ne .pdf-et adj a felhasználóidnak, hanem egy .exe-t és egy .png-t? (pdf->png átalakítás megoldható, de akár a nyomtató program is megoldja, csak nem bővítettem még)

Nagyon minimális a látogatószám. Örülök, ha WW 3 ember - lesz, mert még csak most készül -, de a reményeim azért nem hagynak el. Maga a téma eléggé longtail, így lehet az akár 10 is pár év múlva.
Ezek az ábrák egyébként szabásminták, amiket online generál a rendszer, ezért fontos, hogy mérettartóak legyenek.
Eredetileg csak webben gondolkozta, de lehet, hogy igazad van, és valamilyen applikációt kellene készítenem. Abban azonban nincs olyan nagy rutinom, ráadásul minden oprendszerre ... jobb lenne egységesen.

php-s fejlesztő vagyok, szóval én sem véletlen nyúltam a .net-hez (ha tudnád hány programmal próbáltam előtte nyomtatni, hőnyomtatóra, mérethelyesen, pdf-ből nem elmosódott mocskot kapni kimenetként), ha gondolod, keress meg privátban, ha hobbi project akkor ingyen van a forráskód és a support :)

Ha az történik, hogy a kész pdf-et kinyomtatva csak az ábra egyik fele jön ki (egy lap), akkor megoldás lehet az, hogy először kinyomtatod símán, aztán pedig 180°-kal elforgatva.

--
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com