TCPDF - вставка изображений из массива, дубликаты символов вызывают ошибку кэширования - PullRequest
0 голосов
/ 13 мая 2011

Я использую TCPDF для создания PDF на лету.Перед созданием pdf у меня есть цикл, который берет значения из массива символов и вставляет их в строку, чтобы предоставить имена изображений, это код, который я использую: (я новенький, будь хорошим)

$a= str_split("Foo bar");
$str = "";

walk($a, $str);

function walk($pArray, &$str) {
        $i=1;

         foreach($pArray as $key=>$value) {
                    if(is_array($value)) {


                                                 walk($value,$str);

                    } else if($value== " "){    

                                                 $imvar[$i]="<img src=\"images/space.png\" />";
                                                 $str.= $imvar[$i];
                                                 $i++;

                    } else if($value !=" "){

                                                 $imvar[$i]="<img src=\"images/$value.png\"  />";
                                                 $str.= $imvar[$i];
                                                 $i++;

                    }
         }
}

Таким образом, создается новый тег изображения для каждого символа в массиве (включая имя изображения a.png, b.png и т. Д.)

Это отлично работает, и я получаю желаемый эффект, если у меня нет повторениясимволы в массиве, как в примере, который я привел.

TCPDF выдает эту ошибку, если есть какие-либо повторяющиеся символы:

TCPDF ERROR: [Image] Unable to get image: E:/wamp/www/PDF%20test/cache/mska_2434d8c67d438ea8956284f8725ce42d

Я просмотрел файл tcpdf.php для ссылоккешированию.Я использую md5, я полагаю, что для временного имени, но, очевидно, если используется повторяющийся символ, ему это не понравится.

Любая помощь будет принята с благодарностью.

этот код работает (без повторениясимволы в массиве):

 <?php

require_once('tcpdf.php');

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true,
'UTF-8', false);

$pdf->setPrintHeader(false);

$pdf->setPrintFooter(false);

$pdf->SetFont('helvetica', '', 10);

$pdf->AddPage();

$a= str_split("Fobar");
$str = "";

walk($a, $str);

function walk($pArray, &$str) {
            $i=1;

             foreach($pArray as $key=>$value) {
                        if(is_array($value)) {


                                                                        walk($value,$str);

                        } else if($value== " "){
                                                                        $imvar[$i]="<img src=\"images/space.png\" />";
                                                                        $str.= $imvar[$i];
                                                                        $i++;

                        } else if($value !=" "){

                                                                        $imvar[$i]="<img src=\"images/$value.png\"  />";
                                                                        $str.= $imvar[$i];
                                                                        $i++;

                        }
            }
}

$html = $str;

$pdf->writeHTML($html, true, false, true, false, '');
$pdf->Output('test_images.pdf', 'I');
?>

, и это не работает (повторяющиеся символы в массиве):

<?php

require_once('tcpdf.php');

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true,
'UTF-8', false);

$pdf->setPrintHeader(false);

$pdf->setPrintFooter(false);

$pdf->SetFont('helvetica', '', 10);

$pdf->AddPage();

$a= str_split("Fooooobar");
$str = "";

walk($a, $str);

function walk($pArray, &$str) {
            $i=1;

             foreach($pArray as $key=>$value) {
                        if(is_array($value)) {


                                                                        walk($value,$str);

                        } else if($value== " "){
                                                                        $imvar[$i]="<img src=\"images/space.png\" />";
                                                                        $str.= $imvar[$i];
                                                                        $i++;

                        } else if($value !=" "){

                                                                        $imvar[$i]="<img src=\"images/$value.png\"  />";
                                                                        $str.= $imvar[$i];
                                                                        $i++;

                        }
            }
}

$html = $str;

$pdf->writeHTML($html, true, false, true, false, '');
$pdf->Output('test_images.pdf', 'I');
?>

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Если вы уверены, что проблема в том, что он использует md5, вы можете использовать UUID.Вот класс, который создает действительный UUID:

class UUID {
  public static function v3($namespace, $name) {
    if(!self::is_valid($namespace)) return false;

    // Get hexadecimal components of namespace
    $nhex = str_replace(array('-','{','}'), '', $namespace);

    // Binary Value
    $nstr = '';

    // Convert Namespace UUID to bits
    for($i = 0; $i < strlen($nhex); $i+=2) {
      $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
    }

    // Calculate hash value
    $hash = md5($nstr . $name);

    return sprintf('%08s-%04s-%04x-%04x-%12s',

      // 32 bits for "time_low"
      substr($hash, 0, 8),

      // 16 bits for "time_mid"
      substr($hash, 8, 4),

      // 16 bits for "time_hi_and_version",
      // four most significant bits holds version number 3
      (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x3000,

      // 16 bits, 8 bits for "clk_seq_hi_res",
      // 8 bits for "clk_seq_low",
      // two most significant bits holds zero and one for variant DCE1.1
      (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

      // 48 bits for "node"
      substr($hash, 20, 12)
    );
  }

  public static function v4() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

      // 32 bits for "time_low"
      mt_rand(0, 0xffff), mt_rand(0, 0xffff),

      // 16 bits for "time_mid"
      mt_rand(0, 0xffff),

      // 16 bits for "time_hi_and_version",
      // four most significant bits holds version number 4
      mt_rand(0, 0x0fff) | 0x4000,

      // 16 bits, 8 bits for "clk_seq_hi_res",
      // 8 bits for "clk_seq_low",
      // two most significant bits holds zero and one for variant DCE1.1
      mt_rand(0, 0x3fff) | 0x8000,

      // 48 bits for "node"
      mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
  }

  public static function v5($namespace, $name) {
    if(!self::is_valid($namespace)) return false;

    // Get hexadecimal components of namespace
    $nhex = str_replace(array('-','{','}'), '', $namespace);

    // Binary Value
    $nstr = '';

    // Convert Namespace UUID to bits
    for($i = 0; $i < strlen($nhex); $i+=2) {
      $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
    }

    // Calculate hash value
    $hash = sha1($nstr . $name);

    return sprintf('%08s-%04s-%04x-%04x-%12s',

      // 32 bits for "time_low"
      substr($hash, 0, 8),

      // 16 bits for "time_mid"
      substr($hash, 8, 4),

      // 16 bits for "time_hi_and_version",
      // four most significant bits holds version number 5
      (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x5000,

      // 16 bits, 8 bits for "clk_seq_hi_res",
      // 8 bits for "clk_seq_low",
      // two most significant bits holds zero and one for variant DCE1.1
      (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

      // 48 bits for "node"
      substr($hash, 20, 12)
    );
  }

  public static function is_valid($uuid) {
    return preg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?'.
                      '[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i', $uuid) === 1;
  }
}

Чтобы использовать его:

$ newUUID = UUID :: v4 ();

В этом случае у вас нетпроблемы с одним и тем же временным именем дважды.Дело в том, что если TCPDF использует md5 для создания временных имен с «отпечатками» (то есть использует md5, так что, когда ему нужно получить файл, он делает еще одно преобразование md5 для имени файла), это вам не полезно.

На какой линии у вас есть этот вызов md5?

0 голосов
/ 06 июня 2013

Я не знаю, будет ли это правильным решением для кого-либо для этой проблемы.У меня была та же проблема, и я обнаружил, что это сообщение об ошибке выдается, только если повторное изображение (через несколько страниц) в формате PNG.Если вы делаете то же самое с изображением JPG, TCPDF обрабатывает его правильно, независимо от того, используете ли вы всегда одно и то же имя файла.

...