
package iniciopdfapache;

import java.awt.Color;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;


public class InicioPDFApache {

    
    public static void main(String[] args) throws IOException {

            DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
            DecimalFormat[] decimalFormat = new DecimalFormat[4];
            decimalFormat[0] = new DecimalFormat("###,###,##0", decimalFormatSymbols);
            decimalFormat[1] = new DecimalFormat("##0", decimalFormatSymbols);
            decimalFormat[2] = new DecimalFormat("###,##0.00", decimalFormatSymbols);
            decimalFormat[3] = new DecimalFormat("###,###,##0.00", decimalFormatSymbols);       
            decimalFormatSymbols.setDecimalSeparator(',');
            decimalFormatSymbols.setGroupingSeparator('.');
                                                                 
            String[] textosEspecificosPagina = {"EL CLIENTE", "LA EMPRESA", "LA ADMINISTRACION"};
            
            PDDocument pDDocument = new PDDocument();            
         // protegerDocumento(pDDocument);   
            PDPage pDPage;
            PDPageContentStream pDPageContentStream;
            
            for (int contadorPaginas = 1; contadorPaginas<= textosEspecificosPagina.length; contadorPaginas++){
                pDPage = new PDPage();
                pDDocument.addPage(pDPage);
                pDPageContentStream = new PDPageContentStream(pDDocument, pDPage);
                escribirCuerpoFactura(pDDocument, pDPageContentStream, decimalFormat, contadorPaginas, textosEspecificosPagina);                                 
                pDPageContentStream.close();
            }
            
            pDDocument.save("D:\\PDFs_creados\\Prueba" + new SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date()) + ".pdf");
            pDDocument.close();
    }
    
    
    static void escribirCuerpoFactura(PDDocument pDDocument, PDPageContentStream pDPageContentStream, DecimalFormat[] decimalFormat, int contadorPaginas, String[] textosEspecificosPagina) throws IOException{
                   //  LOGO          
            PDImageXObject imagen = PDImageXObject.createFromFile("imgs/logo_grua.jpg", pDDocument);          
            pDPageContentStream.drawImage(imagen, 50, 690);   
                   //  RECTANGULO
            escribirRectangulo(pDPageContentStream, 180, 680, 150, 60, Color.CYAN);          
                   //  LINEA             
            escribirLinea(pDPageContentStream, 30, 670, 580, 670);
                   //  TEXTO            
            escribirTexto(pDPageContentStream, PDType1Font.TIMES_BOLD_ITALIC, 9, 400, 720, "TEXTO A ESCRIBIR EN EL PDF");
            
            int entero1 = 23045;
            int entero2 = 23;
            double real1 = 340.87;
            double real2 = 12005956.78;
            
            escribirTexto(pDPageContentStream, PDType1Font.COURIER, 8, 400, 560, String.format("%12s",decimalFormat[0].format(entero1)));
            escribirTexto(pDPageContentStream, PDType1Font.COURIER, 8, 400, 530, String.format("%5s",decimalFormat[1].format(entero2)));
            escribirTexto(pDPageContentStream, PDType1Font.COURIER, 8, 400, 500, String.format("%11s",decimalFormat[2].format(real1)));            
            escribirTexto(pDPageContentStream, PDType1Font.COURIER, 8, 400, 470, String.format("%15s",decimalFormat[3].format(real2)));            
                   //  PIE FACTURA  
        escribirTexto(pDPageContentStream, PDType1Font.TIMES_BOLD, 5, 260, 50, "EJEMPLAR PARA "+textosEspecificosPagina[contadorPaginas-1]);          
    }
    
    static void escribirTexto(PDPageContentStream pDPageContentStream, PDFont pdFont, float sizeFuente, float inicioH, float inicioV,  String texto) throws IOException {
               
        pDPageContentStream.beginText();   
        pDPageContentStream.setFont(pdFont, sizeFuente);
        pDPageContentStream.newLineAtOffset(inicioH, inicioV);  
        pDPageContentStream.showText(texto);
        pDPageContentStream.endText();
    }
       
    static void escribirLinea(PDPageContentStream pDPageContentStream, float inicioH, float inicioV, float finH, float finV) throws IOException {
        pDPageContentStream.moveTo(inicioH, inicioV);
        pDPageContentStream.lineTo(finH, finV);
        pDPageContentStream.stroke();
    }        
 
    static void escribirRectangulo(PDPageContentStream pDPageContentStream, float inicioH, float inicioV, float ancho, float alto, Color color) throws IOException {
        pDPageContentStream.setNonStrokingColor(color); 
        pDPageContentStream.addRect(inicioH, inicioV, ancho, alto); 
        pDPageContentStream.fill();
        pDPageContentStream.setNonStrokingColor(Color.BLACK);
    }   
    
    static void protegerDocumento(PDDocument pDDocument) throws IOException{
            AccessPermission accessPermission = new AccessPermission();
            accessPermission.setCanPrint(false);
            accessPermission.setCanPrintDegraded(false);
            accessPermission.setCanExtractContent(false);
            accessPermission.setCanExtractForAccessibility(false);
            accessPermission.setCanFillInForm(true);
            accessPermission.setCanModify(false);
            accessPermission.setReadOnly();
                                        //                                                  PASSWORD      PASSWORD
                                        //                                                  PROPIETARIO   USUARIO: será el NIF del cliente                                                                                                                 
            StandardProtectionPolicy standardProtectionPolicy = new StandardProtectionPolicy("12345", "12345", accessPermission);
            standardProtectionPolicy.setEncryptionKeyLength(128);
            standardProtectionPolicy.setPreferAES(true);
            standardProtectionPolicy.setPermissions(accessPermission);
            pDDocument.protect(standardProtectionPolicy);               
    }
    
}
