Я использую FPDF с расширением, которое я нашел в Интернете под названием TransFPDF, которое позволяет вставлять прозрачные PNG в PDF, который я динамически генерирую с помощью PHP. Однако проблема, с которой я столкнулся, заключается в том, что на создание PDF-файла уходит много времени (сценарий запускается примерно за 30 секунд, когда я встраиваю около 6 символов, где каждый символ представляет собой прозрачный файл PNG. На этот раз также включены текст и фон, но Я проверил время, и это занимает около секунды или два и не замедляет код).
Я обнаружил, что основной медленной точкой является следующая функция:
// needs GD 2.x extension
// pixel-wise operation, not very fast
function ImagePngWithAlpha($file,$x,$y,$w=0,$h=0,$link='')
{
$tmp_alpha = tempnam('.', 'mska');
$this->tmpFiles[] = $tmp_alpha;
$tmp_plain = tempnam('.', 'mskp');
$this->tmpFiles[] = $tmp_plain;
list($wpx, $hpx) = getimagesize($file);
$img = imagecreatefrompng($file);
$alpha_img = imagecreate( $wpx, $hpx );
// generate gray scale pallete
for($c=0;$c<256;$c++) ImageColorAllocate($alpha_img, $c, $c, $c);
// extract alpha channel
$xpx=0;
while ($xpx<$wpx){
$ypx = 0;
while ($ypx<$hpx){
$color_index = imagecolorat($img, $xpx, $ypx);
$alpha = 255-($color_index>>24)*255/127; // GD alpha component: 7 bit only, 0..127!
imagesetpixel($alpha_img, $xpx, $ypx, $alpha);
++$ypx;
}
++$xpx;
}
imagepng($alpha_img, $tmp_alpha);
imagedestroy($alpha_img);
// extract image without alpha channel
$plain_img = imagecreatetruecolor ( $wpx, $hpx );
imagecopy ($plain_img, $img, 0, 0, 0, 0, $wpx, $hpx );
imagepng($plain_img, $tmp_plain);
imagedestroy($plain_img);
//first embed mask image (w, h, x, will be ignored)
$maskImg = $this->Image($tmp_alpha, 0,0,0,0, 'PNG', '', true);
//embed image, masked with previously embedded mask
$this->Image($tmp_plain,$x,$y,$w,$h,'PNG',$link, false, $maskImg);
}
У кого-нибудь есть идеи, как я мог бы ускорить это? Кажется, я не могу заставить его работать быстрее, чем около 4 секунд на символ, который действительно быстро складывается (символ, вероятно, имеет размер около 1000x2000 пикселей, и да, я знаю, что это много, но да, это необходимо для печатного PDF) .
Спасибо.