问题生成具有不同文本的图像

时间:2019-05-27 16:14:42

标签: php intervention

我正在创建一个学生身份证系统,每个学生都有自己的身份证。

为此,我正在使用干预图像,以获取学生数据并放入标准ID卡模板中。

我这样做的基本代码是:

<?php

[...]

$card = Image::make('card_id-model.png');

$card->text('CARD ID', 20, 40, function($font) {
    $font->file('arial.ttf');
    $font->size(24);
    $font->color('#fdf6e3');
    $font->align('center');
    $font->valign('top');
    $font->angle(45);
});

$card->text('NAME: STUDENT\'S NAME', 20, 60, function($font) {
    $font->file('arial.ttf');
    $font->size(24);
    $font->color('#fdf6e3');
    $font->align('center');
    $font->valign('top');
    $font->angle(45);
});

$card->text('CODE: STUDENT\'S CODE', 20, 80, function($font) {
    $font->file('arial.ttf');
    $font->size(24);
    $font->color('#fdf6e3');
    $font->align('center');
    $font->valign('top');
    $font->angle(45);
});

$card->save('card_id - student\'s code.png');

考虑到每次创建图像时都会调用该函数,因此这种方式比较慢。 因此,我决定首先实例化该图像,因为它将用于所有卡的ID。是的,但是由于文本被覆盖,我在循环应用它以同时生成多个文件时遇到了问题。

<?php

[...]

$card = Image::make('card_id-model.png');

$card->text('CARD ID', 20, 40, function($font) {
    $font->file('arial.ttf');
    $font->size(24);
    $font->color('#fdf6e3');
    $font->align('center');
    $font->valign('top');
    $font->angle(45);
});

for ($students as $student) {
    $card->text('NAME: ' . $student->name, 20, 60, function($font) {
        $font->file('arial.ttf');
        $font->size(24);
        $font->color('#fdf6e3');
        $font->align('center');
        $font->valign('top');
        $font->angle(45);
    });

    $card->text('CODE: ' . $student->code, 20, 80, function($font) {
        $font->file('arial.ttf');
        $font->size(24);
        $font->color('#fdf6e3');
        $font->align('center');
        $font->valign('top');
        $font->angle(45);
    });

    $card->save('card_id - ' . $student->code . '.png');
}

那是我发现大量产生的最好,最快的方法。有人有提示吗?

2 个答案:

答案 0 :(得分:0)

我通常首先在AI中进行设计,然后从中提取SVG,然后填充CSS + HTML。由于PHP可以帮助填充它,因此我仅用它来生成HTML。

然后将HTML转换为PDF,然后我从那里将其打印出来。

在任何情况下,PHP都不是理想的生成图像的方法,即使有一种方法也可以。利用浏览器的功能做到这一点。 Google Chrome功能强大,但是如果您希望它在服务器上可运行,则可以使用wkhtmltopdf。

答案 1 :(得分:0)

您遇到文本覆盖问题,因为您正在原始对象上调用text函数。相反,您需要对元素的副本进行修改,然后将其保存在数组中。

请参阅示例。

$generatedCards = [];

foreach ($students as $student) {
    $generatedCard = clone $card;
    $generatedCard->text('...');
    $generatedCards[] = $generatedCard;
}