sábado, 16 de novembro de 2024

O Bostileiro

 NÃO ELOGIE POLÍTICO!

Não elogie político nenhum!
Ao realizar uma obra pública eles estão fazendo tão somente a obrigação deles, ao inaugurar uma ponte (que eles inauguram umas 50 vezes a mesma ponte), por exemplo, é obrigação dele construir a ponte e nem precisa inaugurar, é obrigação entregar a ponte bem construída e no prazo mais curto possível. Inauguração de obra pública é coisa de politiqueiro canalha sem-vergonha.
Todas as obras públicas são feitas com dinheiro de imposto, dinheiro este que sai picado do bolso do cidadão, mas ao chegar no Governo Federal vira montanhas de dinheiro, por isso que se matam e/ou se corrompem a alma por cargos federais.
O SUS, por exemplo, do jeito que está, é uma esmola que os políticos dão para calar a sua boca... e você aceita.
Toda pessoa, sem exceção, que entra naquilo que chamam de "política" no Brasil, entra por vontade própria, ninguém é obrigado; então assuma a responsabilidade e tenha vergonha na cara.
E os eleitores, o cidadão brasileiro, tenha vergonha na cara também e pare de elogiar político.
Político não se elogia, político se cobra o tempo todo!
Mesmo um Político que faça a coisa certa, ele está fazendo mais nada do que a obrigação, mas você, bostileiro(a), adora puxar o saco gordo de um(a) política(o) na esperança de levar alguma vantagem.
Os políticos brasileiros, todos, sem exceção, ganham muito bem, ganham mais do que deveriam, vivem como reis e tem poder... e você ainda elogia eles por roubarem seu dinheiro?!?
Todos, sem exceção, TODOS(AS) são assim!
O que temos no Brasil não é aquilo que se conhece por Política, no Brasil temos politicagem ou, como Ruy Barbosa bem disse já tem uns 110 anos: "O que temos no Brasil é politicalha, o sufixo explica muito bem" político+canalha; ele escreveu um texto chamado "Política X Politicalha" e não perdia uma oportunidade de dizer isso em seus discursos e, depois, apoiou o golpe contra a Monarquia e, mais depois ainda, arrependeu-se, mas aí era tarde.
O próprio Imperador, na época, foi covarde e não lutou pelo país, fugiu na sorrelfa, na surdina.
Esse é o retrato do brasileiro burro covarde (aliás, burro covarde é redundância, pois todo burro é covarde), analfabeto funcional que podemos nominar hoje de Bostileiro!
E de lá para cá a coisa só degringolou.
O que acontece no Brasil é errado em tantos níveis que muitas vezes torna-se difícil explicar, não se encontra palavras nem gestos para explicar tamanhos absurdos.
Lênin bem sofismou: "Pois qualquer verdade, se a exageramos, se ultrapassarmos os limites de sua validade, pode tornar-se um absurdo; aliás, é inevitável que, em tais circunstâncias, ela [a verdade] se torne um absurdo".
Lênin está dizendo para mentir, mentir e mentir até tudo virar um absurdo. E quando se ultrapassa os limites da verdade, temos absurdos. Na realidade, é impossível ultrapassar os limites da verdade, a verdade é o que ela é. "Exagerar a verdade" é eufemismo para mentira.
Porém, Lênin estava correto em sua semântica oculta, pois, malignamente, era o que ele queria: uma população burra e canalha é mais fácil de controlar através da corrupção oferecendo esmolas, bolsa disso, bolsa daquilo, etc, as chamadas "ações afirmativas".
É o decaimento Mentira > Burrice > Ilogicidade > Insanidade > Loucura.
É a cultura da mentira e do fingimento propagada pela Grande Propaganda (aquilo que chamam de grande mídia, uma das maiores responsáveis pelo caos eterno do Brasil).
No Brasil estamos entre a Ilogicidade e a Insanidade. Por exemplo, um propagandista que escreve "tal pessoa está certa e errada ao mesmo tempo" já está insano, pois isso fere os três Princípios da Lógica Formal: Identidade, Não-Contradição e Terceiro Excluído. Porém, o bostileiro passará pano dizendo que: "também não é assim, ele é hipócrita, mas não é burro, qual a intenção dele ao escrever isso?", e continuará insistindo em eufemismos, a popular passada de pano.
Ora, todo hipócrita é burro e todo burro é canalha. A única diferença é que o hipócrita mente, sabe que está mentindo e mente por isso mesmo; enquanto que o burro mente, não sabe que está mentindo, pois é burro demais para saber porque acreditou no hipócrita e fica repetindo a mentira feito um papagaio, mas os resultados da mentira, não importando quem a conta, são os mesmos. De boas intenções o inferno está cheio!
O brasileiro é muito dado a eufemismos, a popular "passada de pano" que significa minimizar a gravidade da mentira, a gravidade do fato, minimizar as consequências, etc, e isso torna-se seletivo, pois "passa-se pano" somente para quem se gosta e tudo vira um "gostar ou não gostar", uma afetação emocional onde a intelectualidade, a Ética, a Moral, o caráter, etc, já não importam mais. Somente o que importa é se eu gosto ou não da beleza física da pessoa, se ela é rica, se tem fama artificail, ou seja, superficialidades, sem levar em conta outras características como as já citadas e, no caso da Política, sem levar em conta o bom caráter e o bom preparo do candidato para o cargo pretendido.
O "gostar ou não gostar" é perigoso, pois São Tomás já nos ensinou na Suma Teológica que o "Bem vem da Razão". Na esmagadora maioria das vezes a boa intenção não basta, de boas intenções o inferno está cheio. Na esmagadora maioria das vezes, um burro bem intencionado causa um estrago muito maior do que um canalha hipócrita. Um canalha hipócrita, para uma pessoa com um mínimo de inteligência, é fácil reconhecer, mas um burro bem intencionado torna-se muitas vezes um pouco mais difícil de reconhecer, mas nem tanto, pois o que ele fala ou escreve é burrice em si, porém, o faz com aquela cara angelical de boas intenções, sendo que ele realmente acredita nas promessas que está fazendo sem saber que nem são promessas, são mentiras em si.
Por exemplo real, no Brasil uma candidata ao cargo de Diretor de uma escola, pública e notória sabidamente amante de um professor casado, elege-se para o cargo porque para o bostileiro essas coisas já não importam mais.
No Brasil impera o "hi hi hi levei vantagem", o brasileiro tornou-se um ser medíocre, abjeto e covarde!
Em outros países tem corrupção também, porém, não nos níveis do Brasil, no Brasil tem muito pilantra por metro quadrado, pilantras estes que saem do seio da população, população esta, que é conivente, pois também é corrupta.
Lembrem-se que os políticos saem da população de um povo e todo povo tem os políticos que merece, pois os elege.
No Bostil, basta ter fama artificial, seja rebolando a bunda, cagando num canto e fazendo vídeo de sua obra no Youtube, sendo que chamam estranhamente de "vídeo de conteúdo", então adquire-se fama artificial, milhões de seguidores e candidata-se e ganha a eleição.
E os chamados "políticos de carreira", cuja expressão já é absurda e auto-contraditória em si, valem-se desses tais "puxadores de votos"; um mais imbecil canalha do que o outro.
O Bostileiro não vota na pessoa, ele vota na fama artificial da pessoa, basta ver o número exagerado de pessoas da área do entretenimento há décadas elegendo-se; pessoas sem preparo nenhum, jogadores de futebol, de vôlei, artistas, atrizes, atores, BBBs, etc.
Entenda-se por "fama artificial" aquela fama que vem do puxa-saquismo, um imbecil elogiando o outro imbecil e vice-versa. A fama natural é aquela em que as outras pessoas elevam alguém pelo seu caráter, talento, honestidade, inteligência, etc, e não somente por ter dinheiro e poder.
Aliás, aquilo que se chama de "políticos", no Brasil não existem, só temos celebridades ou sub-celebridades.
O brasileiro não tem identidade e nunca teve, o brasileiro nunca votou em idéias, partidos, etc, o brasileiro, há uns 40 anos ainda votava na pessoa famosa (o que já era errado), hoje vota somente na fama artificial não importando sequer a pessoa, o preparo dela... o caráter nem se fala, quanto mais mau-caráter mentiroso ladrão sem-vergonha e covarde, é desse que o(a) brasileira(o) gosta.
Para começar a mudar isso: NÃO ELOGIE POLÍTICO, NUNCA!
POLÍTICO SE COBRA ETERNAMENTE!

terça-feira, 5 de novembro de 2024

Enviar mensagem amigável ao usuário trabalhando com as opções do php.ini

O PROBLEMA

   O problema resume-se em enviar uma mensagem amigável de “Este arquivo excede o tamanho permitido” (ou algo parecido) quando se permite upload via POST de determinados arquivos na aplicação/site em PHP porque o PHP não possui um tipo ‘unknown’.

   A diretiva do arquivo php.ini ‘upload_max_filesize’ define o tamanho máximo de arquivo que um usuário pode enviar, enquanto ‘post_max_size’ define a quantidade máxima de dados que podem ser enviados por meio de um POST em um formulário.

   Por exemplo, você pode definir ‘upload_max_filesize’ como 1 megabyte no php.ini, o que significa que o maior arquivo único que um usuário enviará terá 1 megabyte, porém, esse usuário pode enviar 5 arquivos de 1 megabyte se ‘post_max_size’ estiver definido como 5 megabytes.

   Lembrando que, para permitir upload de vários arquivos ao mesmo tempo, é preciso adicionar a propriedade “multiple” ao elemento input no HTML:


<input type=”file” id=”meuinput” multiple>

   As diretivas ‘file_uploads’ e ‘max_file_uploads’ devem estar configuradas no php.ini.

   Os códigos dos arquivos estão na seção "A Solução".

   Nível Intermediário.

   Primeiro veremos as diretivas do php.ini:


- file_uploads = On (Permite uploads de arquivos HTTP);
- max_file_uploads = 10 (Número máximo de arquivos que podem ser enviados em uma única requisição);
- post_max_size = 2M (Tamanho máximo dos dados POST que o PHP aceitará, valor "0" (zero) desabilita o limite. É ignorada se a leitura dos dados POST está desabilitada por meio de ‘enable_post_data_reading = Off’, ou seja, para post_max_size funcionar, ‘enable_post_data_reading’ deve estar no padrão (comentada) ou descomentada com On;
- enable_post_data_reading = On;
- upload_max_filesize = 2M (Tamanho máximo permitido para envio de um arquivo).


   Algumas vezes, caso use FCGID com Apache (FPM/FASTCGI), Nginx, etc, tem de se alterar também os arquivos nesses programas para não dar ERRO 500, 413, 400, etc. Por exemplo, no Apache em algumas distribuições Linux tem de se alterar o arquivo /etc/apache2/mods-available/fcgid.conf (ou num vhost.conf) acrescentando uma linha assim: "FcgidMaxRequestLen 10485760" (10M) tendo o cuidado de deixar esse valor com o mesmo valor de ‘upload_max_filesize’ no php.ini.

   É que o limite para o tamanho do corpo da requisição HTTP estabelecido pelo módulo FastCGI costuma ser de 128 KBytes (131072 bytes) no Apache e 1M no Nginx, o que afeta o tamanho do arquivo para upload com POST, já que o mesmo é enviado no corpo da requisição.

Apache:

Nginx:

   Para fins de informação, na RFC 9110 na seção “18.3. Status Code Registration” tem os códigos 1XX, 2XX, 3XX, 4XX e 5XX.


   O PHP não capta o tamanho do arquivo da aplicação/site quando as diretivas ‘post_max_size’ e ‘upload_max_filesize’ estiverem setadas no php.ini para menos do que o tamanho do arquivo enviado (o que sempre acontecerá, pois é isso mesmo que queremos: limitar o tamanho do upload), porém, o PHP “pega” o tamanho do arquivo no cabeçalho da solicitação HTTP quando esta chega no servidor.

   Por exemplo: quero enviar uma mensagem ao usuário de que o arquivo excedeu o tamanho permitido de upload para determinada aplicação/site, sendo que as diretivas ‘post_max_size’ e ‘upload_max_filesize’ estão setadas em 2M e o usuário tenta enviar um arquivo de 10M; neste caso, a mensagem de “O arquivo excede o limite...” não será exibida com um código simples porque a variável $_FILES[‘arquivo’][‘size’] vem igual a NULL e isso acontece porque o PHP é executado no servidor.

  Outro exemplo: caso as diretivas no php.ini estiverem em 10M e o usuário envia um arquivo de 15M, a mensagem não é exibida porque $_FILES[‘arquivo’][‘size’] vem igual a NULL da mesma maneira.

   Para exibir a mensagem devem-se aumentar as diretivas, porém, isso representa uma incongruência e uma possível falha de segurança, pois, estou permitindo no php.ini, uploads maiores do que o desejado e/ou do que o servidor suporta no conjunto das requisições feitas por vários clientes e, muitas vezes, ao mesmo tempo.

   Além disso, para quanto deve-se aumentar as diretivas?

   Não se sabe o tamanho do arquivo ou quantos arquivos um usuário mal intencionado tentará enviar. Alguns colocam um .htaccess no Apache e em conjunto aumentam as diretivas, porém, não é uma boa prática. Aliás, o próprio Apache e o Nginx desaconselham o uso de tal arquivo. O .htaccess é aconselhado somente onde tenha vários usuários do mesmo servidor web, como, por exemplo, um provedor VPS... e ainda assim com restrições.

   Para quem tenha interesse, deixo aqui um conversor htaccess para Nginx:

https://winginx.com/en/htaccess

   Quando o arquivo é maior do que o permitido e não foram feitas as configurações necessárias, aparece no navegador aquela mensagem padrão do servidor web como, por exemplo, a mensagem do Nginx:

413 Request Entity Too Large nginx/1.10.3” (A entidade solicitada é muito grande), mensagem esta ininteligível para o usuário.

https://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/

   Vamos a um exemplo no caso que nos interessa.

   Considerando o seguinte trecho de código abaixo, que está comentado no código da próxima página, mas utilizei para teste:

var_dump($_FILES[‘arquivo’][‘size’]);
$arquivo = $_FILES[‘arquivo’];
switch($arquivo) {
    case ($arquivo[‘size’] > (2097152)): //2MB
        echo “Este arquivo excede o tamanho de 2MB!”;
    break;
}

   Enviando um arquivo maior do que o limite setado no php.ini gerou o seguinte aviso:

Warning: Undefined array key “arquivo” in /var/www/html/testup/upload.php on line 62

   E o “var_dump($_FILES[‘arquivo’][‘size’]);” gerou o seguinte:

/var/www/html/testup/upload.php:62:null

   E enviando um arquivo dentro do limite, no caso um arquivo com 312,4KB, gerou somente o var_dump, o que é óbvio:

/var/www/html/testup/upload.php:62:int 319925

   No caso da diretiva ‘upload_max_file_size’ estar setada no php.ini em, por exemplo, 10M, se o usuário enviar um arquivo de 15M o PHP não exibe a mensagem porque a variável $arquivo[‘size’] vem como NULL.

   Com ‘if else’ acontece a mesma coisa (entre ‘if else’ e ‘switch’ procuro sempre utilizar quando possível o ‘switch’, pois a diferença de desempenho em relação ao ‘if else’ é muito melhor e bem mais rápido).

   E caso você colocar no código:

case ($arquivo[‘size’] > (10485760)): //10MB

ainda assim o PHP não enviará mensagem e permitirá uploads via POST até o limite permitido no php.ini, no caso, 10MB.

   Alguns aumentam os limites para 100MB ou mais para poder enviar mensagem ou para evitar o “Warning” do PHP. Contudo, aumentar os limites para 100MB, por exemplo, permitirá que um usuário mal intencionado burle o HTML e envie arquivos com 100MB podendo saturar e travar o servidor, pois você mesmo configurou o PHP para aceitar uploads de 100MB.

   Lembrando que a diretiva 'max_file_uploads' (número máximo de arquivos que podem ser enviados em uma única requisição) vem com 20 como padrão, ou seja, 20 arquivos de 100MB são 2GB de upload, isso somente de um cliente.

   Setando agora o ‘upload_max_filesize’ em 2.5MB e o ‘post_max_size’ em 2MB, o ‘var_dump($bytesup);’ nos diz que a conversão está sendo feita (veja a função de conversão no código ao final do texto):

/var/www/html/testup/upload.php:51:float 2621440 //2.5MB

   A questão é que por estarem setados os parâmetros no php.ini (e não pode ser diferente), eles vem como NULL quando o arquivo enviado excede o tamanho permitido. Quando se clica no botão “Enviar”

<input type=”submit” name=”enviar_arquivo” value=”Enviar”>

depois de selecionado um arquivo maior do que 2.5MB, no caso um arquivo de 8.3MB, temos no var_dump($value):

/var/www/html/testup/upload.php:53: array(size=1) 0 => string ‘8716100’(length=7)

que gerará no PHP o seguinte aviso:

Warning: POST Content-Length of 8716100 bytes exceeds the limit of 2097152 bytes in Unknown on line 0

que nos diz que o Content-Length – tamanho do arquivo selecionado – excede o limite em ‘upload_max_filesize’.

   Sabemos que é em ‘upload_max_filesize porque a variável $uploadmaximo recebe o valor de ini_get(‘upload_max_filesize’) para a conversão, além do que, como foi falado antes, o ‘upload_max_filesize’ está em 2.5MB e o ‘post_max_size’ em 2MB

   A questão agora é que o PHP só identifica o tamanho do arquivo enviado pelo HTTP quando a solicitação chega (o que é óbvio, pois o PHP é executado no servidor) e também porque o PHP não tem um tipo ‘unknown’, somente um tipo ‘mixed’.

   Pode se configurar o HTML para restringir os uploads com um input hidden (escondido) e um input que restringe para aceitar somente PDF:

<input type=”hidden” name=”MAX_FILE_SIZE” value=”2097152”>

<input type=”file” name=”arquivo” id=”arquivo” class=”inputfile inputfile-1” accept=”application/pdf,.pdf”>

   Porém, o HTML pode ser burlado mais facilmente do que o PHP, mas é obrigatório fazer as sanitizações tanto no cliente quanto no servidor.

   A estilização em CSS, caso for colocar em produção os arquivos, aconselho a colocar num arquivo CSS em separado e não deixar inline como está. Aliás, sugiro fortemente nunca colocar CSS nem Javascript inline no HTML.

   Para resolver o problema de enviar uma mensagem amigável, vamos aos códigos.


A SOLUÇÃO

   Uma solução para enviar mensagens ao usuário informando que o arquivo excede o limite permitido, além de outras mensagens (no caso de ser enviado por POST), é a seguinte, que, no caso em específico, estamos permitindo somente upload de arquivo PDF até 2MB de tamanho, mas você pode adaptar para suas necessidades.

   E a questão também não é somente enviar a mensagem, mas fazer as verificações necessárias. No código PHP adiante foi utilizada a biblioteca PDFParser (sem Composer) para extrair o conteúdo do arquivo PDF e fazer algumas verificações, porém, você pode usar outra ou adaptar para as suas conveniências.


   O CSS das mensagens está embutido no PHP; o CSS do HTML está embutido no HTML. Fiz umas perfumarias com as mensagens, mas você pode desfazê-las e/ou modificar de acordo com as suas preferências.

   Ao clicar em “Selecione um arquivo” abrirá a janela para escolher o arquivo no sistema e depois de selecionado, o nome do arquivo aparecerá no lugar de “Selecione um arquivo”. Clicando em “Enviar”, o arquivo será enviado e aparecerá a respectiva mensagem.

   Como não há uma maneira de indicar sem JavaScript se algum arquivo foi selecionado, a class=”no-js” na tag <html> é adicionada para que o script adiante (primeira tag <script>) possa saber se o Javascript está disponível no navegador e, caso não estiver, prevalecerá a aparência padrão da entrada do arquivo para fins de usabilidade.



index.html

<!DOCTYPE html>
<html lang="pt-br" class=”no-js”>
    <head>
        <title>Upload de Arquivos</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <!-- remove this if you use Modernizr -->
        <script>
            (function(e,t,n) {
                var r=e.querySelectorAll("html")[0];r.className=r.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2");
            }) (document,window,0);
        </script>
        <script>javascript:window.history.forward(0);</script>
        <script>
                if (window.history.replaceState) {
                    window.history.replaceState(null, null, window.location.href);
            }
        </script>
        <style>
            #tudo{
                margin-top:3%;
                alignment-adjust:middle;
                vertical-align:middle;
                text-align:center;/* "remédio" para o hack do IE */
            } 
            /* Esconde o input */
            input[type='file'] {
                /*display: none;*/
                width: 0;
                height: 0;
                opacity: 0;
            }
            /* Aparência que terá o seletor de arquivo */
            label {
                background-color: #3498db;
                border-radius: 5px;
                color: #fff;
                cursor: pointer;
                margin: 10px;
                padding: 6px 20px;
            }
            #enviar_arquivo{
                background-color:#00ff7f;
                border-color:#00ff7f;
                border-radius:5px;
                cursor: pointer;
            }
        </style>
    </head>

    <body>
        <div id="tudo" class="container">Upload de Arquivos<br>É permitido somente arquivo PDF com, no máximo, 2MB.<br>Arquivo PDF com texto e imagem, será lido somente o texto.<br><br>
            <!-- O tipo de encoding de dados, enctype, DEVE ser especificado abaixo -->
            <form id="form2" name="form2" enctype="multipart/form-data" action="upload.php" method="post">
                <!--O input hidden com MAX_FILE_SIZE deve preceder o campo input file-->
                <input type="hidden" name="MAX_FILE_SIZE" value="2097152"><!-- Setar "upload_max_filesize" no php.ini -->
                <!-- O Nome do elemento input determina o nome da array $_FILES accept="application/pdf" -->
                <!--input type="file" name="arquivo" id="arquivo" accept="application/pdf,.pdf"-->
                <input type="file" name="arquivo" id="arquivo" class="inputfile" accept="application/pdf,.pdf">
                <label for="arquivo">
                    <span>Selecione um arquivo</span>
                </label><br><br>
                <input type="submit" name="enviar_arquivo" id="enviar_arquivo" value="Enviar">
            </form>
        </div>
        <!--Fim div tudo-->
        <script src="./customiza.js"></script>
    </body>

</html>


   O arquivo customiza.js faz a troca dos dizeres “Selecione um arquivo” pelo nome do arquivo selecionado.

customiza.js

// Início
'use strict';
;( function ( document, window, index ) {
        var inputs = document.querySelectorAll( '.inputfile' );
        Array.prototype.forEach.call( inputs, function( input )
    {
        var label = input.nextElementSibling,
        labelVal = label.innerHTML;
        input.addEventListener( 'change', function( e ) {
            var fileName = '';
            if( this.files && this.files.length > 1 )
                fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
            else
                fileName = e.target.value.split( '\\' ).pop();
            if( fileName )
                label.querySelector( 'span' ).innerHTML = fileName;
            else
                label.innerHTML = labelVal;
        });
        // Firefox bug fix
        input.addEventListener( 'focus', function(){ input.classList.add( 'has-focus' ); });
        input.addEventListener( 'blur', function(){ input.classList.remove( 'has-focus' ); });
    });
}( document, window, 0 ));
//Fim


   O arquivo upload.php faz o trabalho pesado.

upload.php

<?php
if(!isset($_SESSION) || (session_status() == PHP_SESSION_NONE) || (session_status() !== PHP_SESSION_ACTIVE) || (session_id() === "" )) {
    session_start();
}
$_SESSION = array();
session_unset();
session_destroy();
require_once 'E:/www/Desenvolvimento/projetoMSG/pdfparser-master/pdfparser-master/alt_autoload.php';
$uploaddir = 'E:/www/Desenvolvimento/projetoMSG/upload/';
//require_once '/var/www/html/projetoMSG/pdfparser-master/pdfparser-master/alt_autoload.php';
//$uploaddir = '/home/debina/Desenvolvimento/projetoMSG/upload/';
//Sete os parâmetros 'post_max_size' e 'upload_max_filesize' com o mesmo valor no php.ini.
//Recebe o dado necessário do formulário:
$dados = filter_input(INPUT_SERVER,'CONTENT_LENGTH');
//$enviar = filter_input(INPUT_POST, 'enviar_arquivo', FILTER_UNSAFE_RAW);
//
//Função que converte string em bytes:
function convertToBytes($string) {
    $unit = strtoupper(substr($string, -1));
    $value = substr($string, 0, -1);
    switch($unit) {
        case 'K':
            return $value * 1024;
        case 'M':
            return $value * 1024 * 1024;
        case 'G':
            return $value * 1024 * 1024 * 1024;
        default:
        return $value;
    }
}
// Converte a string 'XM' (X é um número) do php.ini em bytes usando a função convertToBytes:
$uploadmaximo = ini_get('upload_max_filesize');
$bytesup = convertToBytes($uploadmaximo);
//$postmaximo = ini_get('post_max_size');
//$bytespost = convertToBytes($postmaximo);
//Convertendo $dados para array:
$value = (array)$dados;
/*var_dump($_FILES['arquivo']['size']);*/
$arquivos = (!empty($_FILES['arquivo']));
switch($arquivos) {
    case (!empty($arquivos['size']) > (2097152)): //2MB
        echo "Este arquivo excede o tamanho de 2MB!";
    break;
}
//var_dump($uploadmaximo);
//var_dump($postmaximo).'<br>';
//var_dump($bytesup);
//var_dump($value);
//Selecionando o elemento desejado no array:
//$element = (array_values($value));
//Verifica se a variável $value está vazia e envia para a página inicial caso o usuário der um refresh na página:
if (empty($value[0])) {
    header("Location: index.html"); exit();
}
//Verifica se o tamanho do arquivo é superior ao limite do php.ini e envia mensagem:
if ($value[0] > $bytesup) {
    //echo "<p style='color: #f00;'>Este arquivo excede o tamanho de 2MB!</p>";
    include_once 'index.html';
    echo "<style>
        #tudo {
            animation:fadeInAnimation ease 2s;
            animation-iteration-count:1;
            animation-fill-mode:none;
        }
        @keyframes fadeInAnimation {
            0% {
                opacity:0;
            }
            50% {
                opacity:0;
            }
            100% {
                opacity:1;
            }
        }
        .captcentro{
            position:fixed;
            margin:0 auto;
            top:20.5%;
            left:50%;
            transform:translate(-50%, -50%);
            animation:hideAnimation 0s ease-in 4s;
            animation-fill-mode:forwards;
            border:2px solid #fff;
            padding:15px;
            background-color:#000000;
            border-radius:10px;
            font-size:20px;
            text-align:center;
            /*text-decoration:underline white;*/
        }
        @keyframes hideAnimation {
            to {
                visibility:hidden; width:0; height:0;
            }
        }
        @media only screen and (max-width:576px) {
            .captcentro{
                /*width:280px;*/
                position:fixed;
                margin:0 auto;
                top:19.5%;
                left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode:forwards;
                border:2px solid #fff;
                padding:10px;
                background-color:#000000;
                border-radius:10px;
                font-size:16px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility:hidden; width:0; height:0;
                }
            }
        }
    </style>";
    //header("Refresh: 0");
    echo "<div class='captcentro'><span style='color:red; font-size:20px;'><b>O arquivo excede o tamanho de 2MB!</b></span></div>";
    //header("Refresh: 0; url=pagina2.php");
    exit();
}
$arquivo = $_FILES['arquivo'];
//var_dump($arquivo);
//Verifica se o arquivo é PDF:
if (($arquivo['type'] === '.pdf') or ($arquivo['type'] === 'application/pdf') or ($value[0]) === ($value)) {
    //Captura a exceção da classe Parser do PDFParser e envia mensagem amigável ao usuário:
    try {
        $parser = new \Smalot\PdfParser\Parser(); //var_dump($parser);
        //$pdf = $parser->parseFile($_FILES['arquivo']['tmp_name']);
        $pdf = $parser->parseContent(file_get_contents($_FILES['arquivo']['tmp_name']));
        $text = $pdf->getText();
    }
    catch (Exception $e) {
        //echo "<p style='color: #f00;'>Este arquivo está corrompido, vazio ou protegido!<br>Tente outro arquivo.</p>";
        // $e->getMessage(), "\n";
        include_once 'index.html';
        echo "<style>
            #tudo {
                animation:fadeInAnimation ease 2s;
                animation-iteration-count:1;
                animation-fill-mode:none;
            }
            @keyframes fadeInAnimation {
                0% {
                    opacity:0;
                }
                50% {
                    opacity:0;
                }
                100% {
                    opacity:1;
                }
            }
            .captcentro{
                position:fixed;
                margin:0 auto;
                top:20.5%; left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode: forwards;
                border:4px solid #ffffff;
                padding:15px;
                background-color:#ffff00;
                border-radius:10px;
                font-size:20px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility: hidden; width:0; height:0;
                }
            }
            @media only screen and (max-width:576px) {
                .captcentro{
                    /*width:280px;*/
                    position:fixed;
                    margin:0 auto;
                    top:19.5%;
                    left:50%;
                    transform:translate(-50%, -50%);
                    animation:hideAnimation 0s ease-in 4s;
                    animation-fill-mode:forwards;
                    border:4px solid #ffffff;
                    padding:10px;
                    background-color:#ffff00;
                    border-radius:10px;
                    font-size:16px;
                    text-align:center;
                    /*text-decoration:underline white;*/
                }
                @keyframes hideAnimation {
                    to {
                        visibility:hidden;
                        width:0;
                        height:0;
                    }
                }
            }
        </style>";
        echo "<div class='captcentro'><span style='color:red;'><b>O arquivo está corrompido, vazio ou protegido!</b></span></div>";
        exit();
    }
    //Verifica se o arquivo foi enviado por POST:
    if (is_uploaded_file($_FILES['arquivo']['tmp_name'])) {
        if (!is_dir($uploaddir)) {
            mkdir($uploaddir);
        }
        $uploadfile = $uploaddir . ($_FILES['arquivo']['name']);
        $parser = new \Smalot\PdfParser\Parser();
        //var_dump($parser);
        //$pdf = $parser->parseFile($_FILES['arquivo']['tmp_name']);
        $pdf = $parser->parseContent(file_get_contents($_FILES['arquivo']['tmp_name']));
        $text = $pdf->getText();
        //echo $text;
        //Move o arquivo temporário para a pasta de destino:
        move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploadfile);
        //echo "<p style='color: #f00;'>O arquivo ". $_FILES['arquivo']['name'] ." foi enviado com sucesso!</p>\n<br><br>";
        require_once 'index.html';
        echo "<style>
            #tudo {
                animation:fadeInAnimation ease 2s;
                animation-iteration-count:1;
                animation-fill-mode:none;
            }
            @keyframes fadeInAnimation {
                0% {
                    opacity:0;
                }
                50% {
                    opacity:0;
                }
                100% {
                    opacity:1;
                }
            }
            .captcentro{
                position:fixed;
                margin:0 auto;
                top:20.5%;
                left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode:forwards;
                border:2px solid #ffffff;
                padding:15px;
                background-color:#ffd700;
                border-radius:10px;
                font-size:20px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility:hidden;
                    width:0;
                    height:0;
                }
            }
            @media only screen and (max-width:576px) {
                .captcentro{
                    /*width:280px;*/
                    position:fixed;
                    margin:0 auto;
                    top:19.5%;
                    left:50%;
                    transform:translate(-50%, -50%);
                    animation:hideAnimation 0s ease-in 4s;
                    animation-fill-mode:forwards;
                    border:2px solid #ffffff;
                    padding:10px;
                    background-color:#ffd700;
                    border-radius:10px;
                    font-size:16px;
                    text-align:center;
                    /*text-decoration:underline white;*/
                }
                @keyframes hideAnimation {
                    to {
                        visibility:hidden;
                        width:0;
                        height:0;
                    }
                }
            }
        </style>";
        echo "<div class='captcentro'><span style='color:red; font-size:20px;'><b>O arquivo ". $_FILES['arquivo']['name'] ." foi enviado com sucesso!</b></span></div>";
        exit();
    }
    exit();
}
//Verifica se o tamanho do arquivo é menor ou igual ao limite do php.ini e exibe mensagem:
if (($arquivo['size'] !== 0) or ($value[0]) === ($arquivo['size'])) {
    if (($arquivo['type'] !== '.pdf') or ($arquivo['type'] !== 'application/pdf')) {
        //echo "<p style='color: #f00;'>Este arquivo não é PDF!</p>"; include_once 'index.html’;
        echo "<style>
            #tudo {
                animation:fadeInAnimation ease 2s;
                animation-iteration-count:1;
                animation-fill-mode:none;
            }
            @keyframes fadeInAnimation {
                0% {
                    opacity:0;
                }
                50% {
                    opacity:0;
                }
                100% {
                    opacity:1;
                }
            }
            .captcentro{
                position:fixed;
                margin:0 auto;
                top:20.5%;
                left:50%;
                transform:translate(-50%, -50%);
                animation:hideAnimation 0s ease-in 4s;
                animation-fill-mode:forwards;
                border:2px solid #fff;
                padding:15px;
                background-color:#000000;
                border-radius:10px;
                font-size:20px;
                text-align:center;
                /*text-decoration:underline white;*/
            }
            @keyframes hideAnimation {
                to {
                    visibility:hidden; width:0; height:0;
                }
            }
            @media only screen and (max-width:576px) {
                .captcentro{
                    /*width:280px;*/
                    position:fixed;
                    margin:0 auto;
                    top:19.5%;
                    left:50%;
                    transform:translate(-50%, -50%);
                    animation:hideAnimation 0s ease-in 4s;
                    animation-fill-mode:forwards;
                    border:2px solid #fff;
                    padding:10px;
                    background-color:#000000;
                    border-radius:10px;
                    font-size:16px;
                    text-align:center;
                    /*text-decoration:underline white;*/
                }
                @keyframes hideAnimation {
                    to {
                        visibility:hidden;
                        width:0;
                        height:0;
                    }
                }
            }
        </style>";
        echo "<div class='captcentro'><span style='color:red;'><b>O arquivo não é PDF!</b></span></div>";
        exit();
    }
}
//Condição que chama o 'index.html' caso o usuário clicar no botão enviar sem selecionar arquivo:
if (($value[0]) !== ($arquivo['size'])) {
    header("Location: index.html");
    exit();
}


CONCLUSÃO

   Você pode (e deve) melhorar os arquivos e adaptá-los para as suas necessidades.
Em pesquisa na internet notei uma falta de artigos, tutoriais, etc, neste sentido de configurar mensagens em PHP após o envio de arquivos.
      A estilização em CSS, caso for colocar em produção os arquivos, aconselho a colocar num arquivo CSS em separado e não deixar inline como está.

   Enfim, deixo como mais uma sugestão de programação neste sentido.