Template genereren met Imagick

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tom Swinkels

Tom Swinkels

10/04/2013 15:40:15
Quote Anchor link
Beste Programmeurs,

Op het moment ben ik bezig met een script van een afbeelding maakt (png) van teksten.

Het probleem is dat ik een positie moet kunnen opgeven vanaf waar de tekst begint, en dan moet kunnen aangeven hoe groot het vak moet zijn waar de tekst in moet komen.

Bovenstaande is mij gelukt met Imagick, probleem is echter dat wanneer de tekst er niet op past, de tekst die er af valt op een nieuwe pagina moet komen.

Ik krijg dit niet voor elkaar en heb totaal geen idee hoe ik kan uitrekenen welke tekst op de volgende pagina moet komen.

Onderstaand script gebruik ik voor één pagina te maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
set_time_limit( 0 );

////////////////////////////////////////////////////////////////////////////////////

$imTitleWidth = 500;
$imTitleHeight = 50;
 
$imTitle = new Imagick();
$imTitle->setBackgroundColor( "transparent" );
$imTitle->setFont( "Calibri.ttf" );
$imTitle->setpointsize( "36px" );
$imTitle->setOption( "fill", "#5d00f5" );
$imTitle->newPseudoImage( $imTitleWidth, $imTitleHeight, "caption:Reünie De Ranonkel" );
$imTitle->setImageFormat( "png" ) ;

////////////////////////////////////////////////////////////////////////////////////

$imTextWidth = 1000;
$imTextHeight = 530;

$text = "Een werkgroep is bezig met het organiseren van een reünie van de eerste jaren van openbare basisschool De Ranonkel in Someren.


Daarvoor worden ouders, kinderen en leerkrachten uitgenodigd, die in de jaren 1990-1998 betrokken waren bij de Ranonkel; van de houten noodbouw tot tweejaar in het nieuwe gebouw aan de Dommel: de pioniers van de openbare school.


De reünie vindt plaats in De Ranonkel zelf op zaterdag 22 juni van 14.00 uur tot 17.00 uur.


De werkgroep wil voor een hapje en een drankje zorgen en daarom wordt aan iedere bezoeker een bijdrage gevraagd in de kosten van € 5.


Aanmelden kan tot 15 juni bij Loes Verbeten via e-mail loes.verbeten@upcmail.nl.


De opgave wordt definitief na overmaking van het verschuldigde bedrag op rekeningnr: 0156403463 t.n.v. L. Verbeten"
;

$imText = new Imagick();
$imText->setBackgroundColor( "transparent" );
$imText->setFont( "Calibri.ttf" );
$imText->setpointsize( "23px" );
$imText->setOption( "fill", "#ff0000" );
$imText->newPseudoImage( $imTextWidth, $imTextHeight, "caption:" . $text );
$imText->setImageFormat( "png" ) ;

////////////////////////////////////////////////////////////////////////////////////

$imPageWidth = 40;
$imPageHeight = 40;
 
$imPage = new Imagick();
$imPage->setBackgroundColor( "transparent" );
$imPage->setFont( "Calibri.ttf" );
$imPage->setpointsize( "20px" );
$imPage->setOption( "fill", "#000000" );
$imPage->newPseudoImage( $imPageWidth, $imPageHeight, "caption:1|1" );
$imPage->setImageFormat( "png" ) ;

////////////////////////////////////////////////////////////////////////////////////

$image = new Imagick();
$image->readImage( 'nieuws_brandweer.png' );

$image->compositeImage( $imTitle, imagick::COMPOSITE_OVER, "216px", "28px" );
$image->compositeImage( $imText, imagick::COMPOSITE_OVER, 216, 131 );
$image->compositeImage( $imPage, imagick::COMPOSITE_OVER, 1219, 672 );

$image->writeImages( 'test-1.png', true );

header( "Content-Type: image/png" );
echo $image;
?>
 
PHP hulp

PHP hulp

04/12/2021 06:15:31
 
Dennis WhoCares

Dennis WhoCares

10/04/2013 15:44:33
Quote Anchor link
Tom Swinkels op 10/04/2013 15:40:15:
Ik krijg dit niet voor elkaar en heb totaal geen idee hoe ik kan uitrekenen welke tekst op de volgende pagina moet komen.


je bedoelt op een nieuwe regel?
Dan zou je kunnen proberen met wordwrap.
Ik ben niet bekend met wordwrap of deze \n herkent als een nieuwe regel.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$output = wordwrap($text,8,'\n',true);


Dit zorgt er alleen niet voor dat je hele worden krijgt, maar om de 8 karakters gooit het een \n toe
Gewijzigd op 10/04/2013 15:53:41 door Dennis WhoCares
 
Tom Swinkels

Tom Swinkels

10/04/2013 15:58:10
Quote Anchor link
@dennis, ik bedoel dat wanneer de tekst er dus buiten valt omdat die niet meer in het vak pas wat ik heb opgegeven (1000x530) moet de tekst in een nieuwe pagina komen.

Ik moet dus op een of andere manier uitrekenen hoeveel tekens in het vak van 1000x530 passen, en op die manier uitrekenen. Alleen de ene keer zijn de letters groter dan de andere keer, dus hoe reken ik uit hoeveel tekens er op passen?
 
Dennis WhoCares

Dennis WhoCares

10/04/2013 16:08:00
Quote Anchor link
Ik snap nou wat je bedoeld ja.
Dat is best lastig, je zou voor de grote van elke lettertypegrote moeten testen hoeveel er in het hele vak past
aantal regels en aantal karakters naast elkaar

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
substr_count($text, "\n")

Dit telt hoeveel regels je hebt in je tekst.

Daar zul je dan wat mee moeten doen

Ik weet niet of de bijv. 20px de hoogte is van je tekst.
Maar je zou ook de hoogte van het plaatje kunnen delen door 20px
en zoveel rijen kun er in het plaatje past.
Heeft je tekst meer regels, dan zul je je tekst moeten opdelen en voor ieder deel opnieuw plaatje / 'pagina' maken
Gewijzigd op 10/04/2013 16:17:05 door Dennis WhoCares
 
Frank Nietbelangrijk

Frank Nietbelangrijk

10/04/2013 17:20:52
Quote Anchor link
1. zet je tekst om in een array van woorden met explode(' ', $text);
2. maak een lus waarmee je telkens één woord aan een zin toevoegd.
daarna gebruik je de queryFontMetrics functie om een array van fontafmetingen te krijgen
(je moet onderstaande code even proberen en kijken welk item uit de array van toepassing is)
zolang de zin niet te lang is blijf je woorden toevoegen.
Indien de zin wel te lang is haal je het laatste woord er weer af en begin je met een nieuwe zin.
leuke uitdaging!

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
/* Create a new Imagick object */
$im = new Imagick();

/* Create an ImagickDraw object */
$draw = new ImagickDraw();

/* Set the font */
$draw->setFont('/path/to/font.ttf');

/* Dump the font metrics, autodetect multiline */
var_dump($im->queryFontMetrics($draw, "Hello World!"));
?>
 
Tom Swinkels

Tom Swinkels

11/04/2013 12:40:00
Quote Anchor link
@Frank, bedoel je dit?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$text
= "Een werkgroep is bezig met het organiseren van een reünie van de eerste jaren van openbare basisschool De Ranonkel in Someren.

Daarvoor worden ouders, kinderen en leerkrachten uitgenodigd, die in de jaren 1990-1998 betrokken waren bij de Ranonkel; van de houten noodbouw tot tweejaar in het nieuwe gebouw aan de Dommel: de pioniers van de openbare school.

De reünie vindt plaats in De Ranonkel zelf op zaterdag 22 juni van 14.00 uur tot 17.00 uur.

De werkgroep wil voor een hapje en een drankje zorgen en daarom wordt aan iedere bezoeker een bijdrage gevraagd in de kosten van € 5.

Aanmelden kan tot 15 juni bij Loes Verbeten via e-mail loes.verbeten@upcmail.nl.

De opgave wordt definitief na overmaking van het verschuldigde bedrag op rekeningnr: 0156403463 t.n.v. L. Verbeten"
;

$width = 600;
$height = 400;

$im = new Imagick();
$draw = new ImagickDraw();

$draw->setFont('Calibri.ttf');
$draw->setFontSize('20px');

$data = $im->queryFontMetrics( $draw, $text );

if( $data['textWidth'] < $width )
{

    // woord toevoegen
}
else
{
    // nieuwe zin.
}
?>


Toevoeging op 11/04/2013 22:55:46:

Vandaag samen met een collega lopen knutselen, en met een hoop berekeningen is het gelukt.

Hij moet namelijk ook kijken naar de alinea's je kunt niet een halve alinea op een volgende pagina plaatsen, dus als de alinea niet past moet hij heel de alinea op de volgende pagina gooien. De nieuwe pagina mag dan ook weer niet beginnen met een enter, dus daar moet ook weer na gekeken worden.

Het bovenstaande heeft ons hierbij wel flink geholpen!
 
Tom Swinkels

Tom Swinkels

19/12/2013 02:09:57
Quote Anchor link
Ondertussen heb ik dit toch weer opgepakt.

Het is nu bijna gelukt, het enigste probleem dat ik nu nog heb is dat wanneer er een enter staat (enkele) hij ook een dubbelen enter pakt...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?
$myString
= 'Net als boven de grond is het in de bodem een ‘eten en gegeten worden’.

Bacteriën, schimmels, protozoa (eencellige diertjes), aaltjes, mijten, wormen en zelfs mollen zorgen hier voor een voedselketen.

Dit bodemleven zorgt er o.a. voor dat plantenresten worden afgebroken, het verzorgt de structuur van de bodem, verbetert het vochtvast-
houdend vermogen en beperkt de aantallen ziekteverwekkende organismen.

Op donderdag 19 december houdt Willy van de Vorst hierover een lezing in het Klok & Peel Museum aan de Ostaderstraat 23 in Asten.

Aanvang 20.00 uur.

De lezing is gratis voor leden van Groei & Bloei.

Niet-leden betalen € 2.'
;

//DE GROOTTE VAN HET VAK WAAR DE TEKST IN MOET KOMEN
$imTextWidth = 1024;
$imTextHeight = 582;

$im = new Imagick();
$draw = new ImagickDraw();
//JUISTE LETTERTYPEN AANGEZIEN HET FORMAAT PER LETTERTYPE ANDERS KAN ZIJN
$draw->setFont( 'segoe-wp.ttf' );
$draw->setFontSize( '32' );

//TEKST REPLACE
$myString = preg_replace( array( '/\r\n/', '/\r/' ), '#PH', $myString );

//MAAR PARAGRAFEN
$userParagraphs = explode('#PH', $myString);

//HAAL LEGEN ARRAYS WEG
$userParagraphs = array_filter( $userParagraphs );

if( $userParagraphs )
{

    $systemParagraphs = ARRAY();
    $systemParagraphNumber = 0;

    foreach( $userParagraphs as $userParagraph )
    {

        //EXPLOSE WOORDEN UIT PARAGRAAF
        $paragrapWords = explode( " ", $userParagraph );
        
        //GOOI DE LEREN ARRAYS WEG
        $paragrapWords = array_filter( $paragrapWords );
        
        //TEL AANTAL WOORDEN IN DEZE PARAGRAAF
        $paragrapTotalWords = count( $paragrapWords );
        
        $wordNumber = 1;
        foreach( $paragrapWords AS $paragrapWord )
        {

            //ZIJN WE BIJ HET EERSTE WOORD?
            if( $wordNumber == 1 )
            {

                $newLine = $paragrapWord;

                if( $wordNumber == $paragrapTotalWords )
                {

                    $systemParagraphs[$systemParagraphNumber][] = $newLine;
                }
            }

            else
            {
                $result = $im->queryFontMetrics( $draw, $newLine . ' ' . $paragrapWord );
                //IS HET WOORD KLEINER DAN HET TEKST VAK? DAN MAG HIJ ER NOG EEN WOORD AAN TOEVOEGEN
                if( $result['textWidth'] < $imTextWidth )
                {

                    $newLine = $newLine . ' ' . $paragrapWord;
                }

                else
                {
                    //DE ZIN WORDT TE LANG EN WE MAKEN EEN NIEUWE PARAGRAAF
                    $systemParagraphs[ $systemParagraphNumber ][] = $newLine;
                    
                    //WE BEGINNEN OPNIEUW MET DE NEWLINE TE VULLEN
                    $newLine = $paragrapWord;
                }

                
                if( $wordNumber == $paragrapTotalWords )
                {

                    //DE ZIN WORDT TE LANG EN WE MAKEN EEN NIEUWE PARAGRAAF
                    $systemParagraphs[ $systemParagraphNumber ][] = $newLine;
                }
                
            }

            $wordNumber++;
        }

        $systemParagraphNumber++;
    }
}


if( $systemParagraphs )
{

    $pages = ARRAY();
    $pagesNumber = 0;
    $lineNumber = 1;
    $aantal = 0;
    
    $result = $im->queryFontMetrics( $draw, 'A' );
        
    foreach( $systemParagraphs AS $systemParagraph )
    {
    
        $paraGrapText = null;
    
        foreach( $systemParagraph AS $systemLine )
        {

            $paraGrapText .= $systemLine . '<br />';
        
            //TEL AANTAL REGELS IN DEZE PARAGRAAF
            $paragrapTotalLines = count( $systemParagraph )+1;
        }

        
        $aantal = $aantal + $paragrapTotalLines * $result['textHeight'];
        if( $aantal >= $imTextHeight )
        {

            //BEGIN OPNIEUW
            $aantal = $paragrapTotalLines * $result['textHeight'];
            
            $pagesNumber++;
        }

        $pages[ $pagesNumber ][] = $paraGrapText;
    }
}

                            
if( $pages )
{

    $number = 0;
    $numberAllPages = count( $pages );
    
    foreach( $pages AS $paragraps )
    {

        $number++;
        $tekst = null;
        foreach ( $paragraps AS $paragrap )
        {

            $tekst .= $paragrap . '<br />';
        }

        
        echo $tekst;
        
        echo 'Pagina ' . $number . ' van ' . $numberAllPages;
        
        echo '<br />';
    }
}

?>


Levert dit op (let niet op de special charters):

----
Net als boven de grond is het in de bodem een ‘eten en gegeten
worden’.

Bacteriën, schimmels, protozoa (eencellige diertjes), aaltjes, mijten,
wormen en zelfs mollen zorgen hier voor een voedselketen.

Dit bodemleven zorgt er o.a. voor dat plantenresten worden afgebroken,
het verzorgt de structuur van de bodem, verbetert het vochtvast-

houdend vermogen en beperkt de aantallen ziekteverwekkende
organismen.

Pagina 1 van 2
Op donderdag 19 december houdt Willy van de Vorst hierover een lezing
in het Klok & Peel Museum aan de Ostaderstraat 23 in Asten.

Aanvang 20.00 uur.

De lezing is gratis voor leden van Groei & Bloei.

Niet-leden betalen € 2.

Pagina 2 van 2
----

Hier gaat het fout:

--
Dit bodemleven zorgt er o.a. voor dat plantenresten worden afgebroken,
het verzorgt de structuur van de bodem, verbetert het vochtvast-

houdend vermogen en beperkt de aantallen ziekteverwekkende
organismen.
--

Die witte lege regel hoor daar dus niet thuis!

Iemand enig idee wat ik fout doe?
Gewijzigd op 19/12/2013 02:12:57 door Tom Swinkels
 
Michael -

Michael -

19/12/2013 10:13:20
Quote Anchor link
Je plaatst op regel 39 overal een enter achter dus lijkt me niet heel raar.

Je zou 137 tm 142 kunnen vervangen door onderstaande.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
        foreach ( $paragraps AS $paragrap )
        {
            $paragraparray[] = $paragrap;
        }
        
        echo $tekst . implode('<br/>',$paragraparray);
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.