Add more than one image in PDF using mpdf

Asked

Viewed 2,656 times

-3

I need to generate a PDF with the MPDF class inside the PDF needs to contain some images, which will be sent through the form.html page, which sends the images to gera-pdf.php which processes and converts the content to PDF

html form.

<form method="post" enctype="multipart/form-data" action="gera-pdf.php">
Selecione uma imagem: <input name="arquivo" type="file" />
<br />
<input type="submit" value="Gerar PDF" />
</form>

gera-pdf.php

  <?php
 ob_start(); //inicia o buffer
?>

 <!--COMEÇA CONTEUDO DO PDF-->




 <!--TERMINA CONTEUDO DO PDF-->


<?php
 $html = ob_get_clean();
// pega o conteudo do buffer, insere na variavel e limpa a memória

$html = utf8_encode($html);
// converte o conteudo para uft-8


include("mpdf60/mpdf.php");
// inclui a classe


$mpdf = new mPDF();
// cria o objeto

$mpdf->allow_charset_conversion=true;
// permite a conversao (opcional)
$mpdf->charset_in='UTF-8';
// converte todo o PDF para utf-8

$mpdf->WriteHTML($html);
// escreve definitivamente o conteudo no PDF

$mpdf->Output();
// imprime

exit();
// finaliza o codigo

?>

Code that receives the upload

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Upload de arquivos</title>
</head>

<body>
<?php
// verifica se foi enviado um arquivo 
if(isset($_FILES['arquivo']['name']) && $_FILES["arquivo"]["error"] == 0)
{

  echo "Você enviou o arquivo: <strong>" . $_FILES['arquivo']['name'] . "      </strong><br />";
echo "Este arquivo é do tipo: <strong>" . $_FILES['arquivo']['type'] . "</strong><br />";
echo "Temporáriamente foi salvo em: <strong>" . $_FILES['arquivo']['tmp_name'] . "</strong><br />";
echo "Seu tamanho é: <strong>" . $_FILES['arquivo']['size'] . "</strong> Bytes<br /><br />";

$arquivo_tmp = $_FILES['arquivo']['tmp_name'];
$nome = $_FILES['arquivo']['name'];


// Pega a extensao
$extensao = strrchr($nome, '.');

// Converte a extensao para mimusculo
$extensao = strtolower($extensao);

// Somente imagens, .jpg;.jpeg;.gif;.png
// Aqui eu enfilero as extesões permitidas e separo por ';'
// Isso server apenas para eu poder pesquisar dentro desta String
if(strstr('.jpg;.jpeg;.gif;.png', $extensao))
{
    // Cria um nome único para esta imagem
    // Evita que duplique as imagens no servidor.
    $novoNome = md5(microtime()) . $extensao;

    // Concatena a pasta com o nome
    $destino = 'imagens/' . $novoNome; 

    // tenta mover o arquivo para o destino
    if( @move_uploaded_file( $arquivo_tmp, $destino  ))
    {
        echo "Arquivo salvo com sucesso em : <strong>" . $destino . "</strong><br />";
        echo "<img src=\"" . $destino . "\" />";
    }
    else
        echo "Erro ao salvar o arquivo. Aparentemente você não tem permissão de escrita.<br />";
}
else
    echo "Você poderá enviar apenas arquivos \"*.jpg;*.jpeg;*.gif;*.png\"<br />";
 }
 else
 {
   echo "Você não enviou nenhum arquivo!";
 }
?>
</body>
</html>

Within "COMECA PDF CONTENT" of the generate-pdf.php code I placed the code that receives the upload (in this case the image) as shown below.

when I click GENERATE PDF on the form.html page it calls the page gera-pdf.php, which already opens a PDF with the image, however it is possible to send only one image, and I wanted to send more than one image

Follow the link with the files in Dropbox for more understanding https://www.dropbox.com/s/h7pfvgyl7v1xvug/gera-pdf.zip?dl=0

      <?php
 ob_start(); //inicia o buffer
?>

 <!--COMEÇA CONTEUDO DO PDF-->



 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8" />
 <title>Upload de arquivos</title>
</head>

<body>
<?php
// verifica se foi enviado um arquivo 
if(isset($_FILES['arquivo']['name']) && $_FILES["arquivo"]["error"] == 0)
{

 echo "Você enviou o arquivo: <strong>" . $_FILES['arquivo']['name'] . "    </strong><br />";
echo "Este arquivo é do tipo: <strong>" . $_FILES['arquivo']['type'] . "</strong><br />";
echo "Temporáriamente foi salvo em: <strong>" . $_FILES['arquivo']['tmp_name'] . "</strong><br />";
echo "Seu tamanho é: <strong>" . $_FILES['arquivo']['size'] . "</strong> Bytes<br /><br />";

$arquivo_tmp = $_FILES['arquivo']['tmp_name'];
$nome = $_FILES['arquivo']['name'];


// Pega a extensao
$extensao = strrchr($nome, '.');

// Converte a extensao para mimusculo
$extensao = strtolower($extensao);

 // Somente imagens, .jpg;.jpeg;.gif;.png
 // Aqui eu enfilero as extesões permitidas e separo por ';'
 // Isso server apenas para eu poder pesquisar dentro desta String
 if(strstr('.jpg;.jpeg;.gif;.png', $extensao))
 {
    // Cria um nome único para esta imagem
    // Evita que duplique as imagens no servidor.
    $novoNome = md5(microtime()) . $extensao;

    // Concatena a pasta com o nome
    $destino = 'imagens/' . $novoNome; 

    // tenta mover o arquivo para o destino
    if( @move_uploaded_file( $arquivo_tmp, $destino  ))
    {
        echo "Arquivo salvo com sucesso em : <strong>" . $destino . "</strong><br />";
        echo "<img src=\"" . $destino . "\" />";
    }
    else
        echo "Erro ao salvar o arquivo. Aparentemente você não tem permissão de escrita.<br />";
}
else
    echo "Você poderá enviar apenas arquivos \"*.jpg;*.jpeg;*.gif;*.png\"<br />";
}
else
{
  echo "Você não enviou nenhum arquivo!";
}
?>
</body>
</html>



   <!--TERMINA CONTEUDO DO PDF-->


  <?php
  $html = ob_get_clean();
  // pega o conteudo do buffer, insere na variavel e limpa a memória

  $html = utf8_encode($html);
  // converte o conteudo para uft-8


   include("mpdf60/mpdf.php");
   // inclui a classe


   $mpdf = new mPDF();
   // cria o objeto

   $mpdf->allow_charset_conversion=true;
  // permite a conversao (opcional)
  $mpdf->charset_in='UTF-8';
  // converte todo o PDF para utf-8

  $mpdf->WriteHTML($html);
  // escreve definitivamente o conteudo no PDF

  $mpdf->Output();
 // imprime

exit();
// finaliza o codigo

?>

1 answer

0


It seems to me that your problem is nowhere near:

however it is possible to send only one image, and I wanted to send more than one image

The way you did the upload is what allows you to send only one image, I will not go into much detail, but there are a number of flaws in your code and I really recommend studying a little more PHP, because the flaw is more in the use of php than in the classes it is using, as the omission of { after the else with an indentation that will cause conflicts in the PHP interpreter and you left spaces before.

Multiple upload using HTML markup

To upload multiple files you can use [] in html that allows working with an array, for example:

<form method="post" enctype="multipart/form-data" action="gera-pdf.php">

Imagem 1: <input name="arquivo[]" type="file" />
Imagem 2: <input name="arquivo[]" type="file" />
Imagem 3: <input name="arquivo[]" type="file" />
Imagem 4: <input name="arquivo[]" type="file" />
Imagem 5: <input name="arquivo[]" type="file" />

<br />
<input type="submit" value="Gerar PDF" />
</form>

Before leaving pro PHP see these details:

  • I’m not sure but I think the tags <html> and body are expendable in mPDF.
  • The strrchr($nome, '.'); does not check the actual type of the image, it only checks the extension, ie a file can use the extension. jpg but it can be a text file which can cause flaws in your script, read this /a/73497/3635

php should look something like:

<?php
ob_start();

function mimeType($file)
{
    $mimetype = false;

    if (class_exists('finfo')) {//PHP5.4+
        $finfo    = finfo_open(FILEINFO_MIME_TYPE);
        $mimetype = finfo_file($finfo, $file);
        finfo_close($finfo);
    } else if (function_exists('mime_content_type')) {//php5.3 ou inferiror
        $mimetype = mime_content_type($file);
    } else {
        echo 'Habilite o php_fileinfo.dll (ou fileinfo.so) no php.ini e reiniciei o servidor';
        exit;
    }

    return $mimetype;
}

function upload($current)
{
    $arquivo_tmp = $_FILES['arquivo']['tmp_name'][$current];
    $nome = $_FILES['arquivo']['name'][$current];

    echo "Você enviou o arquivo: <strong>" . $nome . " </strong><br />";
    echo "Este arquivo é do tipo: <strong>" . $_FILES['arquivo']['type'][$current] . "</strong><br />";
    echo "Temporáriamente foi salvo em: <strong>" . $arquivo_tmp . "</strong><br />";
    echo "Seu tamanho é: <strong>" . $_FILES['arquivo']['size'][$current] . "</strong> Bytes<br /><br />";

    $permitidos = array(//Não é necessário jpg pois pro mime-types só existe image/jpeg
        'jpeg', 'png', 'gif'
    );

    //Detecta o mime-type
    $infos = mimeType($arquivo_tmp);

    //Transforma image/jpeg em jpeg por exemplo
    $infos = str_replace('image/', '', $infos);

    //Remove content-types experimentais, como icon/x-icon
    // (eu não sei se a API do php reconhece content-types experimentais,
    // é apenas por garantia)
    $infos = str_replace('x-', '', $infos);

    if(in_array($infos, $permitidos))
    {
        // Cria um nome único para esta imagem
        // Evita que duplique as imagens no servidor.
        // $current é usado pra evitar que todas fotos usem o mesmo nome
        // Usando a informação extraida do mime-type como extensão
        $novoNome = md5(microtime()) . '-' . $current . '.' . $infos;

        // Concatena a pasta com o nome
        $destino = 'imagens/' . $novoNome; 

        // tenta mover o arquivo para o destino
        if(move_uploaded_file($arquivo_tmp, $destino))
        {
            echo "Arquivo salvo com sucesso em : <strong>" . $destino . "</strong><br />";
            echo "<img src=\"" . $destino . "\" />";
        }
        else
        {
            echo "Erro ao salvar o arquivo. Aparentemente você não tem permissão de escrita.<br />";
            exit;//Previne gerar o pdf
        }
    }
    else
    {
        echo "Você poderá enviar apenas arquivos \"*.jpg;*.jpeg;*.gif;*.png\"<br />";
        exit;//Previne gerar o pdf
    }
}

$files = $_FILES["arquivo"]["error"];
$i = 0;
$j = 0;

foreach ($files as $key => $error)
{
    if ($error == UPLOAD_ERR_OK)
    {
        upload($i);
    }
    else if ($error == UPLOAD_ERR_NO_FILE)
    {
        ++$j;
    }
    else
    {
        echo "Erro ao enviar um dos arquivos";
        exit; //previne gerar pdf se houver erros no upload
    }
    ++$i;
}

//Compara a quantidade de arquivos que foram enviados com a quantidade campos "não vazios"
if ($j === $i) {
    echo 'Selecione ao menos um arquivo de foto';
    exit;
}

$html = ob_get_clean();
// pega o conteudo do buffer, insere na variavel e limpa a memória

echo $html = utf8_encode($html);
// converte o conteudo para uft-8

include "mpdf60/mpdf.php";
// inclui a classe

$mpdf = new mPDF();
// cria o objeto

$mpdf->allow_charset_conversion = true;
// permite a conversao (opcional)
$mpdf->charset_in='UTF-8';
// converte todo o PDF para utf-8

$mpdf->WriteHTML($html);
// escreve definitivamente o conteudo no PDF

$mpdf->Output();
//Não necessita de exit no final apenas OMITA o "?>" pra não gerar espaços no final do arquivo

Debugging the mPDF

If you have problems with mPDF use $mpdf->debug = true;, thus:

$mpdf = new mPDF();

$mpdf->debug = true;

$mpdf->allow_charset_conversion = true;
$mpdf->charset_in='UTF-8';

You can also try the showImageErrors, thus:

$mpdf = new mPDF();

$mpdf->showImageErrors = true;

$mpdf->allow_charset_conversion = true;
$mpdf->charset_in='UTF-8';

Constants in PHP for upload

  • UPLOAD_ERR_OK

    Value: 0; no error, upload was successful.

  • UPLOAD_ERR_INI_SIZE

    Value 1; The file sent exceeds the limit set in the directive upload_max_filesize of php.ini

  • UPLOAD_ERR_FORM_SIZE

    Value: 2; The file exceeds the limit set in MAX_FILE_SIZE in the HTML form.

  • UPLOAD_ERR_PARTIAL

    Value: 3; The file has been partially uploaded.

  • UPLOAD_ERR_NO_FILE

    Value: 4; No file sent.

  • UPLOAD_ERR_NO_TMP_DIR

    Value: 6; Temporary folder missing. Entered in PHP 5.0.3.

  • UPLOAD_ERR_CANT_WRITE

    Value: 7; Failed to write the file to disk. Introduced in PHP 5.1.0.

  • UPLOAD_ERR_EXTENSION

    Value: 8; A PHP extension stopped uploading the file. PHP does not provide a way to determine which extension caused the interruption. Examine the list of extensions loaded with the phpinfo() can help. Introduced in PHP 5.2.0.

Php documentation: http://php.net/manual/en/features.file-upload.errors.php

  • For multiple files, simply put an attribute name="arquivo[]" following of an attribute multiple, is equally functional.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.