Adding more than one image to PDF using mpdf [duplicate]

-3

I need to generate a PDF with the MPDF class inside the PDF must 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

form.html

<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

?>

Uploading code

<!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>

Inside "COMECA CONTENT PDF" of the code generates -pdf.php I put the code that receives the upload (in the case the image) as shown below.

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

  
    
      

Follow the link to the files in the dropbox for more understanding link

    
  
      <?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

?>
    
asked by anonymous 18.10.2015 / 14:39

1 answer

0

It seems to me that your problem is not even close to:

  

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

The way you've uploaded is allowing you to upload only one image, I'm not going to go into too much detail, but there are a lot of flaws in your code and I really recommend you study one bit more PHP because the fault is more in php usage than in the classes you are using, such as omission of { after else with an indentation that will cause conflicts in the PHP interpreter and you have left spaces before. / p>

Making multiple uploads using HTML markup

To upload multiple files you can use [] in html that allows working with a vector, 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 going to PHP see these details:

  • I'm not sure but I think the <html> and body tags 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 .jpg extension but can be a text file which can cause your script to fail read this link

The 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 mPDF

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

$mpdf = new mPDF();

$mpdf->debug = true;

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

You can also try showImageErrors , like this:

$mpdf = new mPDF();

$mpdf->showImageErrors = true;

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

PHP constants for upload

  • UPLOAD_ERR_OK

    Value: 0; there was no error, the upload was successful.

  • UPLOAD_ERR_INI_SIZE

    Value 1; The uploaded file exceeds the limit defined in the directive

  • UPLOAD_ERR_FORM_SIZE

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

  • UPLOAD_ERR_PARTIAL

    Value: 3; The file was partially uploaded.

  • UPLOAD_ERR_NO_FILE

    Value: 4; No files were uploaded.

  • UPLOAD_ERR_NO_TMP_DIR

    Value: 6; Temporary folder is missing. Introduced in PHP 5.0.3.

  • UPLOAD_ERR_CANT_WRITE

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

  • UPLOAD_ERR_EXTENSION

    Value: 8; An extension of PHP has stopped uploading the file. PHP does not provide a way to determine which extension caused the interrupt. Browsing the list of extensions loaded with upload_max_filesize can help. Introduced in PHP 5.2.0.

Documentation php: link

    
18.10.2015 / 20:28