Jump to content

Recommended Posts

Posted (edited)

Olá, boa noite.

Estou com dificuldades para gerar corretamente um PDF de relatório contido em uma view.

A questão é a seguinte:

Quando realizo a requisição para a VIEW através de um formulário POST e carrega a referida VIEW com a tabela de dados bonitinha e tudo mais. Daí quando pressiono as teclas de atalho do teclado: CTRL + P para imprimir ou gerar o PDF e me vem aquela janela de configuração, quando seleciono o layout de impressão como PORTRAIT ou RETRATO, o cabeçalho fica legal, bacana. Mas quando mudo para LANDSCAPE ou PAISAGEM, o cabeçalho só aparece na primeira página e nas demais fica só o espaço do cabeçalho vazio, mas o cabeçalho não aparece.

Em outra situação, quando recarrego a página requisitada e o css foi definido para o modo paisagem, daí o cabeçalho fica normal apenas na primeira página e nas demais sem cabeçalho. Quando faço a alteração nesse momento para o modo retrato, o cabeçalho passa a existir em todas as páginas, mas se volto para paisagem, fica como no primeiro momento citado no parágrafo anterior.

Meu código é o seguinte:

CSS

        th#thimgHeader{
            border-bottom: 1px solid #0000;
            padding: 0px 18px;
            text-align: center;
        }
        th#thimgHeader img{
            width: 95%;
            padding: 5px;
        }
        th#thtituloHeader{
            padding: 0px 0px;
        }
        th#thtituloHeader h4{
            font-weight: bold;
            padding: 0px 0px 5px 0px;
            letter-spacing: 1px;
        }
        body{
            background: rgba(13, 168, 255, 0);
        }


		@media print {
            body,
            .content,
            .page-header-fixed {
                padding: 0 !important;
                margin: 8px 5px 8px 5px !important;
            }
            .sidebar,
            .header,
            .panel-heading,
            .theme-panel {
                display: none !important;
            }
        }

OBS.: Caso eu defina no CSS o size: A4; a página assume diretamente como Retrato e não me deixa realizar alteração na janela da impressora. Caso eu defina o size: A4 landscape; acontece a mesma coisa e automaticamente o cabeçalho não aparece da segunda página em diante.

HTML

<table id="data" class="row-border hover" cellspacing="0" width="98%">
        <thead>
        <tr>
            <th id="thimgHeader" colspan="5">
                <img src="{!! asset('/assets/img/relatorios/header-jp.png') !!}">
            </th>
        </tr>
        <tr>
            <th id="thtituloHeader" colspan="5">
                <h4 class="text-center">

                    {{ $titulo }}

                </h4>
            </th>
        </tr>
        <tr>
            <th>Código</th>
            <th>Assunto</th>
            <th style="text-align: center;">Tipo de Atendimento</th>
            <th>Data de Atendimento</th>
            <th>Nome</th>
        </tr>
        </thead>
        <tfoot id="footer">
        <tr>
            <th colspan="5">
                <h3 id="markPage"></h3>
            </th>
        </tr>
        </tfoot>
        <tbody>
        @foreach($atendimentos as $atendimento)
            <tr>
                <td>{{ $atendimento->id }}</td>
                <td>{{ $atendimento->assunto }}</td>
                <td style="padding-left: 2.4%;">{{ $atendimento->tipoatendimento }}</td>
                <td>{{ $atendimento->datareal }}</td>
                <td>{{ $atendimento->nome }}</td>
            </tr>
        @endforeach
        </tbody>
    </table>

Alguém aqui poderia me ajudar com essa coisa que me está tirando o sono?

 

Agradeço a atenção.

Edited by rafaelcarvalho20
Posted

Não há nenhum problema com o teu código, está tudo a funcionar como deve ser.
Creio que o problema está na tua interpretação de cabeçalho, no que é a impressão e na espetativa que tens quanto a isso.

O HTML não tem a noção do que é um cabeçalho, nem sequer tem a noção de impressão (embora o CSS3 venha endereçar um pouco essa questão).
Quando fazes CTRL+P para imprimir, grosso modo, o browser vai enviar para a impressora a informação que está a mostrar na página, e repara que na página o que chamas de header não se repete. Além disso, o browser não tem noção de que há um elemento que queres repetir após cada quebra de página.

Se necessitas de ter algo que sai bem a nível da impressão, basicamente tens duas hipóteses:

  1. Ter uma view especifica para impressão onde o HTML sai todo bonitinho para sair em cada página A4 (tens de ser tu a fazer as contas e os acertos para saber onde vão cair as quebras de página).
  2. Gerares um PDF (ou outro tipo de documento) já formatado como queres.
  • Vote 1
10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Posted
2 horas atrás, M6 disse:

Não há nenhum problema com o teu código, está tudo a funcionar como deve ser.
Creio que o problema está na tua interpretação de cabeçalho, no que é a impressão e na espetativa que tens quanto a isso.

O HTML não tem a noção do que é um cabeçalho, nem sequer tem a noção de impressão (embora o CSS3 venha endereçar um pouco essa questão).
Quando fazes CTRL+P para imprimir, grosso modo, o browser vai enviar para a impressora a informação que está a mostrar na página, e repara que na página o que chamas de header não se repete. Além disso, o browser não tem noção de que há um elemento que queres repetir após cada quebra de página.

Se necessitas de ter algo que sai bem a nível da impressão, basicamente tens duas hipóteses:

  1. Ter uma view especifica para impressão onde o HTML sai todo bonitinho para sair em cada página A4 (tens de ser tu a fazer as contas e os acertos para saber onde vão cair as quebras de página).
  2. Gerares um PDF (ou outro tipo de documento) já formatado como queres.

Agradeço pela contribuição M6, porém, devo dizer que eu tinha uma view específica onde nela só existia a tabela com os dados, e mesmo assim esse problema ocorria, por isso resolvi colocar dentro do template e ocultar os conteúdos indesejados na impressão.

Também devo esclarecer que a ideia não seria jogar mesmo direto para a impressora, pois o browser já me da alternativa de imprimir ou gerar PDF.

O que não entendo, é porque com a impressão em modo retrato, o head ou cabeçalho da tabela vai se repetir em todas as páginas, mas quando é em modo paisagem, já não aparece em todas as páginas, somente na primeira.

O que tenho é um relatório que vem com informações dinâmicas (pode ser que tenha muitas linhas ou não). Sendo que o cabeçalho deve existir em todas as páginas, logo, fica difícil definir uma quebra de páginas para repetir o cabeçalho.

Acredito que deve haver uma solução para esse problema.

Obrigado pela atenção.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.