PHP FPDF с прозрачным PNG очень медленно - PullRequest
0 голосов
/ 25 августа 2011

Я использую 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) .

Спасибо.

...