Avatar billede Acker Novice
10. juli 2017 - 17:56 Der er 20 kommentarer og
1 løsning

Zend_PDF text skrives på én linie?

Hejsa Eksperter

Jeg har følgende der udskriver mit kommentar felt i en PDF faktura i min Magento Shop:

protected function _printComments($order, Zend_Pdf_Page $page)
    {
        if (Mage::helper('core')->isModuleEnabled('Magemaven_OrderComment')
            && ($order->getCustomerComment() || $order->getCustomerNote())
        ) {
            $comment = Mage::helper('ordercomment')->escapeHtml(
                $order->getCustomerComment() ? $order->getCustomerComment() : $order->getCustomerNote()
            );
            $this->y -= 15;
            $page->drawText(Mage::helper('ordercomment')->__('Order Comment'), 35, $this->y, 'UTF-8');
            $this->y -= 15;
            $leftToPrint = explode(' ', $comment);
            $availableWidth = $page->getWidth();
            while (!empty($leftToPrint)) {
                $currentLine = $leftToPrint;
                $leftToPrint = array();
                while ($this->widthForStringUsingFontSize(
                        implode(' ', $currentLine), $page->getFont(), $page->getFontSize()
                    ) > $availableWidth) {
                    $leftToPrint[] = array_pop($currentLine);
                }
                $page->drawText(implode(' ', $currentLine), 35, $this->y, 'UTF-8');
            }
        }
    }

Mit problem er: den skriver kommentar teksten i ÉN LINIE. Dvs ved lange kommentarer skriver den ovenpå tidl. tekst som gør den ulæselig.

Hvor i koden er det jeg skal rette til så den laver de nødvendige line brakes og wrapper teksten og viser hele tekst-klumpen rigtig?

Se eksempel her:
https://www.dropbox.com/s/ovsqziac6fdzzig/eksperten_zend_tekst_en_linie.jpg?dl=0

På forhånd tak for jeres tid

vh. Daniel
Avatar billede erikjacobsen Ekspert
11. juli 2017 - 00:16 #1
Jeg vil tro at du inde i while-løkken skal huske at gå en linie ned ved hvert gennemløb. Og det lader til at være linien:

    $this->y -= 15;

der gør det. (Jeg gætter lidt - længe siden jeg har lavet pdf fra php)
Avatar billede Acker Novice
11. juli 2017 - 23:50 #2
hmm har forsøgt at pille lidt ved denne del men uden held. Jeg kan ikke helt få den til at smide extra 15 pixels på for hver gang den løber igennem loopet :/
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 00:50 #3
Jah, jeg ved jo ikke hvad der er rigtigt, men umiddelbart efter linien med:

  $page->drawText(implode(' ', $currentLine), 35, $this->y, 'UTF-8');

kan du prøve at sætte den her ind:

    $this->y -= 15;
Avatar billede Acker Novice
12. juli 2017 - 01:16 #4
Fedt :) - det virker :) ...lidt - dog går det helt galt efter linie 1 så når linie 2 output generes er der HELT rod i teksten.

Se evt her:
https://www.dropbox.com/s/e35oo7bw5nuk0qj/eksperten_zend_tekst_fokert.jpg?dl=0

- Det må være noget med while-løkken der ikke er i vinkel
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 08:52 #5
Interessant, og overraskende. Må jeg lige se koden, som den ser ud nu?
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 08:55 #6
Og en ting kan jeg allerede se. Der skal ikke stå array_pop, men array_shift  -  det forklarer nemlig hvorfor ordene kommer baglæns  :)
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 09:03 #7
Så er der en sjov ting mere: Lige efter hvert punktum må der stå et sjovt tegn, som ikke er et mellemrum. Har du tastet den viste tekst ind, eller kopieret den fra fx Word?
Avatar billede Acker Novice
12. juli 2017 - 17:48 #8
protected function _printComments(Zend_Pdf_Page $page, $order)
    {
        if (Mage::helper('core')->isModuleEnabled('Magemaven_OrderComment')
            && ($order->getCustomerComment() || $order->getCustomerNote())
        ) {
            $comment = Mage::helper('ordercomment')->escapeHtml($order->getCustomerComment() ? $order->getCustomerComment() : $order->getCustomerNote());
            $this->y -= 15;
            $page->drawText(Mage::helper('ordercomment')->__('Order Comment'), 25, $this->y, 'UTF-8');
            $this->y -= 15;
            $leftToPrint = explode(' ', $comment);
            $availableWidth = $page->getWidth();
            while (!empty($leftToPrint)) {
                $currentLine = $leftToPrint;
                $leftToPrint = array();
                while ($this->widthForStringUsingFontSize(
                        implode(' ', $currentLine), $page->getFont(), $page->getFontSize()
                    ) > $availableWidth) {
                    $leftToPrint[] = array_shift($currentLine);
                }
                $page->drawText(implode(' ', $currentLine), 25, $this->y, 'UTF-8');
                $this->y -= 15;

            }
        }
    }

giver følgende:

https://www.dropbox.com/s/aqssxxo3619ityt/eksperten_zend_tekst_fokert_shift.jpg?dl=0

"...efter hvert punktum..." hvad mener du her?

Jeg har blot kopieret koden fra min Dreamwaever editor :)
Avatar billede Acker Novice
12. juli 2017 - 17:50 #9
Som du kan se er der stadig rod med ord-rækkefølge med: array_shift

btw tak for tin tid Erik og fedt du vil hjælpe mig her :)
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 18:20 #10
Nå, ja, så kommer linierne i omvendt rækkefølge. Lidt bedre, syn's jeg, men det er jo ikke godt nok.

Prøv at undlade at kopiere teksten ind, men skriv den direkte fra tastaturet.

Og så: Vi bibeholder array_pop, men laver lige en array_reverse på den. Dette er kun den inderste del af koden.

            while (!empty($leftToPrint)) {
                $currentLine = $leftToPrint;
                $leftToPrint = array();
                while ($this->widthForStringUsingFontSize(
                        implode(' ', $currentLine), $page->getFont(), $page->getFontSize()
                    ) > $availableWidth) {
                    $leftToPrint[] = array_pop($currentLine);
                }
$leftToPrint = array_reverse($leftToPrint);
                $page->drawText(implode(' ', $currentLine), 25, $this->y, 'UTF-8');
                $this->y -= 15;

            }
Avatar billede Acker Novice
12. juli 2017 - 19:45 #11
WOW det virkede! Lææææækkert og MANGE tak :)

Så ser det rigtig ud:
https://www.dropbox.com/s/b17xy3rjb5c4dg0/eksperten_zend_tekst_virker.jpg?dl=0

Har de lidt underlige tegne der kommer efter punktum, som du siger men mon ikke jeg kan leve med det ;)

MANGE TAK - Du er en champ!
Avatar billede Acker Novice
12. juli 2017 - 19:48 #12
...og hele den nye kode blev til:

protected function _printComments(Zend_Pdf_Page $page, $order)
    {
        if (Mage::helper('core')->isModuleEnabled('Magemaven_OrderComment')
            && ($order->getCustomerComment() || $order->getCustomerNote())
        ) {
            $comment = Mage::helper('ordercomment')->escapeHtml($order->getCustomerComment() ? $order->getCustomerComment() : $order->getCustomerNote());
            $this->y -= 15;
            $page->drawText(Mage::helper('ordercomment')->__('Order Comment'), 15, $this->y, 'UTF-8');
            $this->y -= 15;
            $leftToPrint = explode(' ', $comment);
            $availableWidth = $page->getWidth();
            while (!empty($leftToPrint)) {
                $currentLine = $leftToPrint;
                $leftToPrint = array();
                while ($this->widthForStringUsingFontSize(
                        implode(' ', $currentLine), $page->getFont(), $page->getFontSize()
                    ) > $availableWidth) {
                    $leftToPrint[] = array_pop($currentLine);
                }
$leftToPrint = array_reverse($leftToPrint);
                $page->drawText(implode(' ', $currentLine), 15, $this->y, 'UTF-8');
                $this->y -= 15;

            }
        }
    }
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 20:08 #13
Jeg er lidt nysgerrig ... Dreamweaver er noget underligt noget, fra gamle dage - li'som mig ... men er det fordi DW prøver at overholde den typografiske konvention at der skal ekstra luft efter et sætningspunktum. Det er noget jeg har hørt - jeg synes ikke jeg kan finde eksempler i mine bøger.

Men måden DW så gør det på, kan være at indsætte et særligt mellemrumstegn - sikkert noget unicode, som ikke er det mellemrum, som PHP splitter sætningen op på, og heller ikke er et tegn som PDF-fonten forstår (ser ud til at blive en "firkant" som ingen bredde har).

Så ... hvad nu hvis du selv indtaster flere ekstra mellemrum efter et punktum? Kommer den trælse firkant uden bredde fortsat, og kommer de ekstra mellemrum også?
Avatar billede Acker Novice
12. juli 2017 - 22:49 #14
hehe - jeg er også gammel så DW har fuldt mig maaaaange år. Jeg har fundet ud af hvorfor den laver: ☒

Det er i den string den får ind og hver gang så er et linieskift i den tekst-klump. Det kan den åbentbart ikke læse og laver så istedet et: "☒"

Giver det mening?
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 23:01 #15
Hvis det ligner et linieskift, så skal vi da bare lave det linieskift om til et rigtigt jysk mellemrum.

Hvad gør det ved problemet at ændre

            $this->y -= 15;
            $leftToPrint = explode(' ', $comment);

til

            $this->y -= 15;
            $comment = preg_replace("/[\r\n]/"," ",$comment);
            $leftToPrint = explode(' ', $comment);
Avatar billede Acker Novice
12. juli 2017 - 23:16 #16
WOW ja det virkede ;)

WOW - Spiller max :)

Se:
https://www.dropbox.com/s/vhdqcjyyq2u9lia/eksperten_zend_tekst_virker_uden_box_tegn.jpg?dl=0

Ny er det snart 100% i vinkel - har lige getWidth() / availableWidth jeg skal have til at passe 100%.

Pt skriver den "den fulde side-vidde" den skal have lidt padding: left og right jo :)
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 23:19 #17
Et lille jysk hack - træk lidt fra bredden, fx ændre

$availableWidth = $page->getWidth();

til

$availableWidth = $page->getWidth()-100;
Avatar billede Acker Novice
12. juli 2017 - 23:37 #18
Juhuuu - jysk hack gjorde liiige det hele meget flottere! som prikken over i'et!

Se:
https://www.dropbox.com/s/xgk0bhyu5m968wx/eksperten_zend_tekst_virker_final.jpg?dl=0

Du er er en verdensstjerne!

Denne bug med PDF'en her har irriteret mig i over 3 år ;0)
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 23:41 #19
Ja, det er smukt.  Hvor mon Silervej er henne ;)    Godt lille sommerproblem.
Avatar billede erikjacobsen Ekspert
12. juli 2017 - 23:42 #20
Ok - Brøndby Strand ...
Avatar billede Acker Novice
13. juli 2017 - 00:01 #21
hehe ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester