1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Editar PDF ao realizar Download usando StreamedContent

Olá a todos: Uso o código abaixo para realizar o Upload de um PDF do tipo BLOB do Mysql sem problemas no PrimeFaces: Minha dúvida é se consigo editar esse PDF adicionando dados de quem baixou. Não queria modificar esse código pois funciona muito bem para mim e apenas modificá-lo de forma que eu consiga editá-lo ao mesmo tempo em que realizo o download. Andei estudando o Itext através do PdfStamper, porém ainda não encontrei uma forma de adaptá-lo. Alguma dica? Desde já agradeço.




package manager;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import entity.ControleDownload;
import entity.Documento;
import entity.Usuario;
import persistence.ControleDownloadDAO;

@Named
@ViewScoped
public class DownloadArquivo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private Documento documento;

    @Inject
    private Usuario usuario;

    @Inject
    private ControleDownload controleDownload;

    @Inject
    private ControleDownloadDAO controleDAO;

    public StreamedContent teste(Documento documento) throws Exception {

        InputStream stream = new ByteArrayInputStream(documento.getArquivo());

        Locale br = new Locale("pt", "BR");
        SimpleDateFormat sdfBr = new SimpleDateFormat("dd MMM yyyy", br);

        StreamedContent file = new DefaultStreamedContent(stream, "application/pdf",
                documento.getTipoDocumento().getTipoDocumento() + " Nr " + documento.getNumero() + " - "
                        + documento.getGrupo().getGrupo() + " - " + sdfBr.format(documento.getDataDocumento())
                        + ".pdf");

        TimeZone.setDefault(TimeZone.getTimeZone("GMT-03:00"));
        Date data = new Date();

        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

        controleDownload.setDataDownload(data);
        controleDownload.setLogin(usuario.getLogin());
        controleDownload.setUsuario(usuario.getUsuario());
        controleDownload.setCodigoDocumento(documento.getCodigo());
        controleDownload.setDocumento(documento.getTipoDocumento().getTipoDocumento() + " Nr " + documento.getNumero()
                + " - " + documento.getGrupo().getGrupo() + " - " + sdfBr.format(documento.getDataDocumento()));

        controleDAO.cadastrar(controleDownload);

        return file;
    }

    public Documento getDocumento() {
        return documento;
    }

    public void setDocumento(Documento documento) {
        this.documento = documento;
    }

}

Depois de muito estudo eu consegui e deixarei aqui para quem precisar. Ainda não está perfeito, mas está funcional. O código permite realizar o download de um documento gravado em banco ao mesmo tempo em que acrescenta, watermark, QRCODE e bloqueia e edição do PDF sem no entanto pedir senha. PS: o método controleDownload é apenas usado como auditoria gravando dados de acesso ao documento em outra tabela no banco. É isso. Obrigado.


package manager;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.TimeZone;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BarcodeQRCode;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;

import entity.ControleDownload;
import entity.Documento;
import entity.Usuario;
import persistence.ControleDownloadDAO;

@Named
@ViewScoped
public class DownloadArquivo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private Documento documento;

    @Inject
    private Usuario usuario;

    @Inject
    private ControleDownload controleDownload;

    @Inject
    private ControleDownloadDAO controleDAO;

    private StreamedContent downloadFile;

    public StreamedContent teste(Documento documento) throws Exception {

        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        String caminho = externalContext.getRealPath("") + File.separator + "resources" + File.separator + "pdf"
                + File.separator;

        InputStream stream = new ByteArrayInputStream(documento.getArquivo());

        Locale br = new Locale("pt", "BR");
        SimpleDateFormat sdfBr = new SimpleDateFormat("dd MMM yyyy", br);
        SimpleDateFormat sdfBr2 = new SimpleDateFormat("EEEE dd MMM yyyy HH:mm:ss", br);

        StreamedContent file = new DefaultStreamedContent(stream, "application/pdf",
                documento.getTipoDocumento().getTipoDocumento() + " Nr " + documento.getNumero() + " - "
                        + documento.getGrupo().getGrupo() + " - " + sdfBr.format(documento.getDataDocumento())
                        + ".pdf");

        TimeZone.setDefault(TimeZone.getTimeZone("GMT-03:00"));
        Date data = new Date();

        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

        controleDownload.setDataDownload(data);
        controleDownload.setLogin(usuario.getLogin());
        controleDownload.setUsuario(usuario.getUsuario());
        controleDownload.setCodigoDocumento(documento.getCodigo());
        controleDownload.setDocumento(documento.getTipoDocumento().getTipoDocumento() + " Nr " + documento.getNumero()
                + " - " + documento.getGrupo().getGrupo() + " - " + sdfBr.format(documento.getDataDocumento()));

        controleDAO.cadastrar(controleDownload);

        PdfReader pdfReader = new PdfReader(file.getStream());
        // Criar PdfStamper.
        PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(caminho + "boletim.pdf"));

//        pdfStamper.setEncryption(null, null,
//                PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_DEGRADED_PRINTING
//                        | PdfWriter.ALLOW_SCREENREADERS | PdfWriter.ALLOW_MODIFY_CONTENTS,
//                PdfWriter.DO_NOT_ENCRYPT_METADATA);                

//         Criptografa o PDF: permite imprimir, leitura e bloqueia de escrita. Nao precisa de senha.        
        pdfStamper.setEncryption(null, null,
        PdfWriter.ALLOW_PRINTING 
                | PdfWriter.ALLOW_SCREENREADERS,
        PdfWriter.DO_NOT_ENCRYPT_METADATA);                

//        pdfStamper.setEncryption("pwd123".getBytes(), "cp123".getBytes(),PdfWriter.ALLOW_COPY, PdfWriter.ENCRYPTION_AES_256);        

        // Numero de paginas no pdf.
        int pages = pdfReader.getNumberOfPages();

        // Texto watermark
        Font FONT = new Font(Font.FontFamily.HELVETICA, 50, Font.BOLD, BaseColor.RED);
        Font FONT2 = new Font(Font.FontFamily.HELVETICA, 20, Font.BOLD, BaseColor.RED);
        Phrase p = new Phrase("Documento de Acesso Restrito", FONT);
        Phrase p2 = new Phrase("Documento de Acesso Restrito", FONT2);

        // propriedades
        PdfContentByte over;

        BarcodeQRCode barcodeQRCode = new BarcodeQRCode("Usuário: " + usuario.getUsuario() + " - Download: "
                + sdfBr2.format(controleDownload.getDataDownload()), 200, 200, null);
        Image codeQrImage = barcodeQRCode.getImage();
        codeQrImage.scaleAbsolute(60, 60);


        // Editar meta-data PDF
        HashMap<String, String> info = pdfReader.getInfo();
        info.put("Subject", "Documento Reservado");
        info.put("Author", "NOME DO AUTOR");
        info.put("Keywords", "");
        info.put("Title", "Documento de Acesso Restrito");
        info.put("Creator", "Joselei - Programador Java");
        info.put("Producer", "Joselei - Programador Java");

        // updated meta-data PDF
        pdfStamper.setMoreInfo(info);

        // Interagir o pdf pelas paginas.
        for (int i = 1; i <= pages; i++) {

            Image image = Image.getInstance(codeQrImage);
            Image image2 = Image.getInstance(codeQrImage);
            PdfContentByte content = pdfStamper.getUnderContent(i);
            image.setAbsolutePosition(5, 785);
            image2.setAbsolutePosition(525, 5);
            content.addImage(image);
            content.addImage(image2);

            // Pegar tamanho da pagina e a posicao
            over = pdfStamper.getOverContent(i);
            over.saveState();

            // Ajustar transparencia
            PdfGState state = new PdfGState();
            state.setFillOpacity(0.2f);
            over.setGState(state);

            // add watermark no texto e imagem
            ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 337, 400, 60);
            ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p2, 300, 30, 0);
            ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p2, 300, 810, 0);

            over.restoreState();

        }


        // fechar o pdfStamper.
        pdfStamper.close();
        pdfReader.close();

        InputStream stream2 = new FileInputStream(new File(caminho + "boletim.pdf"));
        downloadFile = new DefaultStreamedContent(stream2, "application/pdf", file.getName());

        return downloadFile;
    }

    public Documento getDocumento() {
        return documento;
    }

    public void setDocumento(Documento documento) {
        this.documento = documento;
    }

}
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java ou faça a sua própria pergunta.