Example usage for org.apache.pdfbox.pdmodel PDDocument addPage

List of usage examples for org.apache.pdfbox.pdmodel PDDocument addPage

Introduction

In this page you can find the example usage for org.apache.pdfbox.pdmodel PDDocument addPage.

Prototype

public void addPage(PDPage page) 

Source Link

Document

This will add a page to the document.

Usage

From source file:dtlgenerator.myDataReader.java

public void PdfGenerator(String pdfFileNameBase, List<String> cycles) throws IOException, COSVisitorException {
    GlobalVar.dirMake(new File(pdfFileNameBase)); //create a folder with the same name

    int rowCount = 0;
    int pageCount = 1;
    PDPage page; //default size PAGE_SIZE_A4
    PDPageContentStream stream;//from  w  w w.j  a  v  a  2s . com
    //page.setRotation(90); //counterclock wise rotate 90 degree  ////left hand rule

    //        stream.setFont(PDType1Font.COURIER, FONT_SIZE);
    String lastUpdate = null;
    String lastCycle = null;
    System.out.println("DTL_DATA keyset:" + DTL_DATA.keySet());
    System.out.println("Cycles empty? " + cycles.isEmpty());
    System.out.println(cycles);
    for (String updateDate : DTL_DATA.keySet()) {
        Map<String, List<String>> thisDTData = DTL_DATA.get(updateDate);
        lastUpdate = updateDate;
        System.out.println("thisDT_DATA keyset:" + thisDTData.keySet());
        for (String cycle : thisDTData.keySet()) {
            if (cycles.isEmpty() || cycles.contains(cycle)) {
                PDDocument pdf = new PDDocument();
                lastCycle = cycle;
                List<String> thisCycle = thisDTData.get(cycle);
                pageCount = 1; // new cycle, restart page num
                page = new PDPage(); //page break
                stream = new PDPageContentStream(pdf, page, true, false);
                stream.beginText();
                page.setRotation(PAGE_ROT_DEGREE);
                //stream.setFont(PDType1Font.COURIER, FONT_SIZE);
                addBigFontUpdateNumberAndCycle(updateDate, cycle, stream);
                stream.setFont(PDType1Font.COURIER, FONT_SIZE);
                // stream.setFont(PDType1Font.
                int thisCycleRowCount = 0;
                for (String row : thisCycle) {
                    if (thisCycleRowCount > MAX_NUM_TRANS) {
                        //close the current page
                        setupFootNote(stream, pageCount, cycle, updateDate);
                        pageCount++;
                        stream.endText();
                        stream.close();
                        pdf.addPage(page);

                        // start a new page
                        page = new PDPage();
                        stream = new PDPageContentStream(pdf, page, true, false);
                        page.setRotation(PAGE_ROT_DEGREE);
                        stream.beginText();
                        stream.setFont(PDType1Font.COURIER, FONT_SIZE);
                        thisCycleRowCount = 0;
                    }
                    stream.setTextRotation(TEXT_ROT_RAD, TRANS_X + thisCycleRowCount * INVERVAL_X, TRANS_Y);
                    stream.drawString(row);
                    thisCycleRowCount++;
                    //System.out.println("Update:" + updateDate + " Cycle: " + cycle + " " + row);
                }
                setupFootNote(stream, pageCount, lastCycle, lastUpdate);
                stream.endText();
                stream.close();
                pdf.addPage(page);
                String pdfFileName = pdfFileNameBase + "\\DTL UPDT " + updateDate + " " + cycle + ".pdf";

                pdf.save(pdfFileName);
                pdf.close();
            }
        }
    }

    // pdf.save(pdfFileName);        
    // pdf.close();      
}

From source file:es.udc.fic.medregatas.util.PDFUtils.java

public static void printPDF(String docName) throws IOException, COSVisitorException {

    createPdfDirectoryIfNotExists();//from  w ww.  ja  va 2 s .c om

    // Create a document and add a page to it
    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);

    // Create a new font object selecting one of the PDF base fonts
    PDFont font = PDType1Font.HELVETICA_BOLD;

    // Start a new content stream which will "hold" the to be created content
    PDPageContentStream contentStream = new PDPageContentStream(document, page);

    // Define a text content stream using the selected font, moving the 
    // cursor and drawing the text "Hello World"
    contentStream.beginText();

    contentStream.setFont(font, 12);
    contentStream.moveTextPositionByAmount(100, 700);
    contentStream.drawString("Hello World");
    contentStream.endText();

    // Make sure that the content stream is closed:
    contentStream.close();

    // Save the results and ensure that the document is properly closed:
    document.save(PDFS_FOLDER + "/" + docName);
    document.close();
}

From source file:evadoc_splitter.pdfsplitter.java

private void split_report(Rectangle2D programa_area, Rectangle2D periodo_area, Rectangle2D id_area,
        Rectangle2D nombre_area, String type, int numberOfPages) {
    // pages = this.doc

    //crear hash id=>nombre que se guarda en la variable global del programa principal

    try {/*from   w  ww  . j av  a  2s  .  com*/
        //iteracion n - 1
        // Create a new empty document
        PDDocument document_to = new PDDocument();
        //aadir la primera pagina
        PDPage page_from = (PDPage) this.document.getDocumentCatalog().getAllPages().get(0);
        document_to.addPage(page_from);
        //obtener datos de la primera pagina
        String programa = get_text_by_area(programa_area, page_from, 1);
        String id = get_text_by_area(id_area, page_from, 0);
        String periodo = get_text_by_area(periodo_area, page_from, 2);
        String nombre = get_text_by_area(nombre_area, page_from, 0);

        String path = "";
        String id_to_name;

        File folder;

        //si solo hay una pagina.
        if (numberOfPages == 1) {
            //document_to.save(type+"_"+programa+"_"+id+"_.pdf");
        }

        //TODO: verificar que ninguno es vacio
        //iteracion n, se comprara n con n-1
        //desde la segunda pagina verificar si el id es el mismo y terminar cuando cambie
        for (int i = 1; i < numberOfPages; i++) {
            page_from = (PDPage) this.document.getDocumentCatalog().getAllPages().get(i);
            String id_next = get_text_by_area(id_area, page_from, i);

            //verificar si es hoja vacia

            //verificar que id_next sea igual que id
            if (id_next.equals(id)) {
                //si es igual al anterior aadir la pagina al documento
                document_to.addPage(page_from);
            } else {
                //momento para crear un hash, que relacione id con nombre, 
                //con el fin de referenciar por id y no por nombre.

                set_id_name_hash(id, nombre); //actualizar relacion id => nombre
                // Save the newly created document
                //obtener nombre del id en cuestion:
                id_to_name = this.local_id_to_name.get(id);
                //verificar si esta disponible la informacion sobre la division                
                if (this.has_division) {
                    String division = this.local_programa_to_division.get(programa);
                    //  path = this.root+"Resultados_"+this.current_time + "\\" +division+"\\"+periodo+"\\"+programa+"\\"+id_to_name;
                    path = this.root + "RES_" + periodo + "\\" + division + "\\" + programa + "\\" + id_to_name;
                } else {
                    //  path = this.root+"Resultados_"+this.current_time + "\\" +programa+"\\"+periodo+"\\"+id_to_name;
                    path = this.root + "RES_" + periodo + "\\" + programa + "\\" + id_to_name;
                }
                //create directory if not exist:
                folder = new File(path);
                if (!folder.exists()) {
                    folder.mkdirs();
                }

                document_to.save(path + "\\" + type + ".pdf");

                //Preparacion para la siguiente iteracion 
                //crear un nuevo documento
                document_to = new PDDocument();
                //aadir la pagina encontrada que es diferente a la anterior
                page_from = (PDPage) this.document.getDocumentCatalog().getAllPages().get(i);
                document_to.addPage(page_from);
                //obtener datos de la  pagina
                id = get_text_by_area(id_area, page_from, i);
                while (id == null) {
                    i++;
                    page_from = (PDPage) this.document.getDocumentCatalog().getAllPages().get(i);
                }
                id = get_text_by_area(id_area, page_from, i);
                programa = get_text_by_area(programa_area, page_from, i);
                periodo = get_text_by_area(periodo_area, page_from, i);
                nombre = get_text_by_area(nombre_area, page_from, i);
                set_id_name_hash(id, nombre);
            }

            //aadir el profesor de la ultima pagina

        }

        //:::::::ultima iteracion:::::

        //momento para crear un hash, que relacione id con nombre, 
        //con el fin de referenciar por id y no por nombre.

        id_to_name = this.local_id_to_name.get(id);
        if (this.has_division) {
            String division = this.local_programa_to_division.get(programa);
            // path = this.root+"Resultados_"+this.current_time + "\\" +division+"\\"+periodo+"\\"+programa+"\\"+id_to_name;
            path = this.root + "RES_" + periodo + "\\" + division + "\\" + programa + "\\" + id_to_name;
        } else {
            // path = this.root+"Resultados_"+this.current_time + "\\" +programa+"\\"+periodo+"\\"+id_to_name;
            path = this.root + "RES_" + periodo + "\\" + programa + "\\" + id_to_name;
        }
        folder = new File(path);
        //obtener nombre del id en cuestion:
        if (!folder.exists()) {
            folder.mkdirs();
        }

        document_to.save(path + "\\" + type + ".pdf");

    } catch (IOException ex) {
        Logger.getLogger(pdfsplitter.class.getName()).log(Level.SEVERE, null, ex);
    } catch (COSVisitorException ex) {
        Logger.getLogger(pdfsplitter.class.getName()).log(Level.SEVERE, null, ex);
    }

    //get periodo

    //get programa

}

From source file:evadoc_splitter.pdfsplitter.java

private void split_report_consolidado_division(Rectangle2D region_div, Rectangle2D region_periodo,
        Rectangle2D region_programa, String type, int numberOfPages) {
    // pages = this.doc

    //crear hash id=>nombre que se guarda en la variable global del programa principal
    Rectangle2D next_region_programa = region_programa;
    try {// w w w  .ja  v  a 2  s.c  om
        //iteracion n - 1
        // Create a new empty document
        PDDocument document_to = new PDDocument();
        //aadir la primera pagina
        PDPage page_from = (PDPage) this.document.getDocumentCatalog().getAllPages().get(0);
        document_to.addPage(page_from);
        //obtener datos de la primera pagina
        String division = get_text_by_area(region_div, page_from, 1);
        String periodo = get_text_by_area(region_periodo, page_from, 2);
        hash_programs(region_programa, page_from, division);

        //si solo hay una pagina.
        if (numberOfPages == 1) {
            //document_to.save(type+"_"+programa+"_"+id+"_.pdf");
        }
        //TODO: verificar que ninguno es vacio

        //iteracion n, se comprara n con n-1
        //desde la segunda pagina verificar si division es vacio o diferente y terminar cuando cambie
        for (int i = 1; i < numberOfPages; i++) {
            page_from = (PDPage) this.document.getDocumentCatalog().getAllPages().get(i);
            String division_next = get_text_by_area(region_div, page_from, i);
            //verificar que div_next sea igual que div, o vacio, por que la hoja vacia hace parte de div
            if (division_next.equals(division) || division_next.equals("")) {

                //si es igual al anterior aadir la pagina al documento
                document_to.addPage(page_from);
                //obtener programas de las siguientes hojasn
                if (!division_next.equals("")) {
                    //si es la hoja vacia no buscar programas.
                    hash_programs(region_programa, page_from, division);
                }
            } else {
                //crear una estructura de resultados, division, periodo consolidado div.

                //File folder = new File(this.root+"Resultados_"+this.current_time + "\\" +division+"\\"+"\\"+periodo+"\\");
                File folder = new File("RES_" + periodo + "\\" + division + "\\");
                if (!folder.exists()) {
                    folder.mkdirs();
                }

                // document_to.save(this.root+"Resultados_"+this.current_time + "\\" +division+"\\"+"\\"+periodo+"\\"+type+".pdf");
                document_to.save("RES_" + periodo + "\\" + division + "\\" + type + ".pdf");

                //Preparacion para la siguiente iteracion 
                //crear un nuevo documento
                document_to = new PDDocument();
                //aadir la pagina encontrada que es diferente a la anterior
                page_from = (PDPage) this.document.getDocumentCatalog().getAllPages().get(i);
                document_to.addPage(page_from);
                //obtener datos de la  pagina
                division = get_text_by_area(region_div, page_from, i);
                periodo = get_text_by_area(region_periodo, page_from, i);
                hash_programs(region_programa, page_from, division);

            }

        }
        //ultima iteracion
        //create directory if not exist:
        // File folder = new File(this.root+"Resultados_"+this.current_time + "\\" +division+"\\"+periodo+"\\");
        File folder = new File("RES_" + periodo + "\\" + division + "\\");
        if (!folder.exists()) {
            folder.mkdirs();
        }
        // document_to.save(this.root+"Resultados_"+this.current_time + "\\" +division+"\\"+periodo+"\\"+"\\"+type+".pdf");
        document_to.save("RES_" + periodo + "\\" + division + "\\" + type + ".pdf");

    } catch (IOException ex) {
        Logger.getLogger(pdfsplitter.class.getName()).log(Level.SEVERE, null, ex);
    } catch (COSVisitorException ex) {
        Logger.getLogger(pdfsplitter.class.getName()).log(Level.SEVERE, null, ex);
    }

    //get periodo

    //get programa

}

From source file:fi.nls.oskari.printout.printing.pdfbox.UsingTextMatrix.java

License:Apache License

/**
 * creates a sample document with some text using a text matrix.
 * /*from  ww w .  j a va2 s  .c o m*/
 * @param message
 *            The message to write in the file.
 * @param outfile
 *            The resulting PDF.
 * 
 * @throws IOException
 *             If there is an error writing the data.
 * @throws COSVisitorException
 *             If there is an error writing the PDF.
 */
public void doIt(String message, String outfile) throws IOException, COSVisitorException {
    // the document
    PDDocument doc = null;
    try {
        doc = new PDDocument();

        // Page 1
        PDFont font = PDType1Font.HELVETICA;
        PDPage page = new PDPage();
        page.setMediaBox(PDPage.PAGE_SIZE_A4);
        doc.addPage(page);
        float fontSize = 12.0f;

        PDRectangle pageSize = page.findMediaBox();

        System.err.println("pageSize " + pageSize);
        System.err.println(
                "pageSize cm " + pageSize.getWidth() / 72 * 2.54 + "," + pageSize.getHeight() / 72 * 2.54);

        float centeredXPosition = (pageSize.getWidth() - fontSize / 1000f) / 2f;
        float stringWidth = font.getStringWidth(message);
        float centeredYPosition = (pageSize.getHeight() - (stringWidth * fontSize) / 1000f) / 3f;

        PDPageContentStream contentStream = new PDPageContentStream(doc, page, false, false);
        contentStream.setFont(font, fontSize);
        contentStream.beginText();
        // counterclockwise rotation
        for (int i = 0; i < 8; i++) {
            contentStream.setTextRotation(i * Math.PI * 0.25, centeredXPosition,
                    pageSize.getHeight() - centeredYPosition);
            contentStream.drawString(message + " " + i);
        }
        // clockwise rotation
        for (int i = 0; i < 8; i++) {
            contentStream.setTextRotation(-i * Math.PI * 0.25, centeredXPosition, centeredYPosition);
            contentStream.drawString(message + " " + i);
        }

        contentStream.endText();
        contentStream.close();

        // Page 2
        page = new PDPage();
        page.setMediaBox(PDPage.PAGE_SIZE_A4);
        doc.addPage(page);
        fontSize = 1.0f;

        contentStream = new PDPageContentStream(doc, page, false, false);
        contentStream.setFont(font, fontSize);
        contentStream.beginText();

        // text scaling
        for (int i = 0; i < 10; i++) {
            contentStream.setTextScaling(12 + (i * 6), 12 + (i * 6), 100, 100 + i * 50);
            contentStream.drawString(message + " " + i);
        }
        contentStream.endText();
        contentStream.close();

        // Page 3
        page = new PDPage();
        page.setMediaBox(PDPage.PAGE_SIZE_A4);
        doc.addPage(page);
        fontSize = 1.0f;

        contentStream = new PDPageContentStream(doc, page, false, false);
        contentStream.setFont(font, fontSize);
        contentStream.beginText();

        int i = 0;
        // text scaling combined with rotation
        contentStream.setTextMatrix(12, 0, 0, 12, centeredXPosition, centeredYPosition * 1.5);
        contentStream.drawString(message + " " + i++);

        contentStream.setTextMatrix(0, 18, -18, 0, centeredXPosition, centeredYPosition * 1.5);
        contentStream.drawString(message + " " + i++);

        contentStream.setTextMatrix(-24, 0, 0, -24, centeredXPosition, centeredYPosition * 1.5);
        contentStream.drawString(message + " " + i++);

        contentStream.setTextMatrix(0, -30, 30, 0, centeredXPosition, centeredYPosition * 1.5);
        contentStream.drawString(message + " " + i++);

        contentStream.endText();
        contentStream.close();

        // Page 4
        {
            page = new PDPage();
            page.setMediaBox(PDPage.PAGE_SIZE_A4);
            doc.addPage(page);
            fontSize = 1.0f;

            contentStream = new PDPageContentStream(doc, page, false, false);
            contentStream.setFont(font, fontSize);
            contentStream.beginText();

            AffineTransform root = new AffineTransform();
            root.scale(72.0 / 2.54, 72.0 / 2.54);

            for (i = 0; i < pageSize.getHeight() / 72 * 2.54; i++) {
                // text scaling combined with rotation
                {
                    AffineTransform rowMatrix = new AffineTransform(root);
                    rowMatrix.translate(1, i);
                    contentStream.setTextMatrix(rowMatrix);
                    contentStream.drawString(message + " " + i);
                }

            }

            contentStream.endText();
            contentStream.close();
        }

        doc.save(outfile);
    } finally {
        if (doc != null) {
            doc.close();
        }
    }
}

From source file:fr.amap.commons.javafx.chart.ChartViewer.java

/**
 * A handler for the export to PDF option in the context menu.
 *///from w w  w.j a va2 s  .  c  om
private void handleExportToPDF() {
    FileChooser fileChooser = new FileChooser();
    fileChooser.setSelectedExtensionFilter(
            new FileChooser.ExtensionFilter("Portable Document Format (PDF)", "pdf"));
    fileChooser.setTitle("Export to PDF");
    File file = fileChooser.showSaveDialog(stage);
    if (file != null) {

        try {

            CanvasPositionsAndSize canvasPositionAndSize = getCanvasPositionAndSize();

            PDDocument doc = new PDDocument();

            PDPage page = new PDPage(new PDRectangle((float) canvasPositionAndSize.totalWidth,
                    (float) canvasPositionAndSize.totalHeight));
            doc.addPage(page);

            BufferedImage image = new BufferedImage((int) canvasPositionAndSize.totalWidth,
                    (int) canvasPositionAndSize.totalHeight, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = image.createGraphics();

            int index = 0;
            for (ChartCanvas canvas : chartCanvasList) {

                Rectangle2D rectangle2D = canvasPositionAndSize.positionsAndSizes.get(index);

                ((Drawable) canvas.chart).draw(g2, new Rectangle((int) rectangle2D.getX(),
                        (int) rectangle2D.getY(), (int) rectangle2D.getWidth(), (int) rectangle2D.getHeight()));
                index++;
            }

            PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, false);
            PDXObjectImage pdImage = new PDPixelMap(doc, image);
            contentStream.drawImage(pdImage, 0, 0);

            PDPageContentStream cos = new PDPageContentStream(doc, page);
            cos.drawXObject(pdImage, 0, 0, pdImage.getWidth(), pdImage.getHeight());
            cos.close();

            doc.save(file);

        } catch (IOException | COSVisitorException ex) {
            Logger.getLogger(ChartViewer.class.getName()).log(Level.SEVERE, null, ex);
        }
        /*ExportUtils.writeAsPDF(this.chart, (int)canvas.getWidth(),
        (int)canvas.getHeight(), file);*/

        /*ExportUtils.writeAsPDF(this.chart, (int)canvas.getWidth(),
                (int)canvas.getHeight(), file);*/
    }
}

From source file:gamma.cvd.calculator.print.CVDPrint.java

private PDDocument createPdfDocument(CVDPatient patient) throws IOException {
    PDDocument document = new PDDocument();
    List<PDPage> pageList = new ArrayList<>();
    PDPage page1 = new PDPage(PDPage.PAGE_SIZE_A4);
    pageList.add(page1);//ww w. ja va  2 s . c o  m
    PDRectangle rect = pageList.get(0).getMediaBox();
    document.addPage(pageList.get(0));
    PDFont fontHelveticaBold = PDType1Font.HELVETICA_BOLD;
    PDFont fontCourier = PDType1Font.COURIER;
    PDFont fontCourierBold = PDType1Font.COURIER_BOLD;
    PDPageContentStream contentStream = new PDPageContentStream(document, pageList.get(0));
    line = 0;
    contentStream.beginText();
    contentStream.setFont(fontHelveticaBold, 18);
    contentStream.moveTextPositionByAmount(leftMargin, rect.getHeight() - initialLineSpace);
    contentStream.drawString("Test record for " + patient.getFirstName() + " " + patient.getLastName());
    contentStream.endText();

    contentStream.setFont(fontCourier, 12);
    writeLine("Patient no.:", String.valueOf(patient.getPatientId()), contentStream,
            rect.getHeight() - patientLineSpace);

    writeLine("First name:", patient.getFirstName(), contentStream, rect.getHeight() - patientLineSpace);

    writeLine("Last name:", patient.getLastName(), contentStream, rect.getHeight() - patientLineSpace);

    writeLine("Date of birth:", patient.getBirthdate().toString(), contentStream,
            rect.getHeight() - patientLineSpace);

    writeLine("Sex:", String.valueOf(patient.getSex()), contentStream, rect.getHeight() - patientLineSpace);
    int n = 0;
    for (CVDRiskData data : patient.getRiskData()) {
        if (n > 0 && n % 3 == 0) {
            contentStream.close();
            PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
            pageList.add(page);
            document.addPage(pageList.get(n / 3));
            contentStream = new PDPageContentStream(document, pageList.get(n / 3));
            line = 0;
            contentStream.beginText();
            contentStream.setFont(fontHelveticaBold, 18);
            contentStream.moveTextPositionByAmount(leftMargin, rect.getHeight() - initialLineSpace);
            contentStream.drawString("Test record for " + patient.getFirstName() + " " + patient.getLastName()
                    + ", page " + ((n / 3) + 1));
            contentStream.endText();
        }
        contentStream.beginText();
        contentStream.moveTextPositionByAmount(leftMargin,
                rect.getHeight() - testDataLineSpace - lineSpace * ++line);
        contentStream.endText();

        contentStream.setFont(fontCourierBold, 12);
        writeLine("Test ID:", String.valueOf(data.getTestId()), contentStream,
                rect.getHeight() - testDataLineSpace);

        contentStream.setFont(fontCourier, 12);
        writeLine("Test date:", data.getTestDate().toString(), contentStream,
                rect.getHeight() - testDataLineSpace);

        writeLine("Cholesterol type:", data.getCholesterolType(), contentStream,
                rect.getHeight() - testDataLineSpace);

        writeLine("Cholesterol mmol/L:", String.format("%.2f", data.getCholesterolMmolL()), contentStream,
                rect.getHeight() - testDataLineSpace);

        writeLine("HDL mmol/L:", String.format("%.2f", data.getHdlMmolL()), contentStream,
                rect.getHeight() - testDataLineSpace);

        writeLine("Diastolic blood pressure:", String.valueOf(data.getBloodPressureDiastolicMmHg()),
                contentStream, rect.getHeight() - testDataLineSpace);

        writeLine("Systolic blood pressure:", String.valueOf(data.getBloodPressureSystolicMmHg()),
                contentStream, rect.getHeight() - testDataLineSpace);

        if (data.isSmoker()) {
            writeLine("Patient is smoker:", "Yes", contentStream, rect.getHeight() - testDataLineSpace);
        } else {
            writeLine("Patient is smoker:", "No", contentStream, rect.getHeight() - testDataLineSpace);
        }

        if (data.isDiabetic()) {
            writeLine("Patient is diabetic:", "Yes", contentStream, rect.getHeight() - testDataLineSpace);
        } else {
            writeLine("Patient is diabetic:", "No", contentStream, rect.getHeight() - testDataLineSpace);
        }

        int score = data.calculateRiskScore();
        writeLine("Risk score:", String.valueOf(score), contentStream, rect.getHeight() - testDataLineSpace);

        int riskPercentage = data.getRiskPercentage(score);
        writeLine("Risk percentage:", new StringBuilder().append(riskPercentage).append(" %").toString(),
                contentStream, rect.getHeight() - testDataLineSpace);
        n++;
    }
    contentStream.close();
    return document;
}

From source file:generarPDF.GenerarFactura.java

public PDDocument crearFactura(int facturaID, JFrame dialogo) {

    try {//  w  w w. ja  va 2s . c o  m

        ControladorFactura controladorFactura = new ControladorFactura();
        Factura facturaActual = controladorFactura.getFactura(" where factura_id=" + facturaID).get(0);

        ControladorCliente controladorCliente = new ControladorCliente();
        Cliente cliente = controladorCliente.obtenerClientePorID(facturaActual.getCliente_id());

        System.out.println(cliente.getCliente_id());

        PDDocument document = new PDDocument();

        PDPage pagina1 = new PDPage();
        document.addPage(pagina1);

        PDFont font = PDType1Font.HELVETICA_BOLD;
        PDFont fontNormal = PDType1Font.HELVETICA;

        PDPageContentStream contenido = new PDPageContentStream(document, pagina1);

        contenido.beginText();
        contenido.setFont(font, 16);
        contenido.moveTextPositionByAmount(30, 730);
        System.out.println("llego aqui -10");

        contenido.drawString("Factura #" + facturaActual.getFactura_id());
        contenido.endText();
        System.out.println("llego aqui -11");

        contenido.beginText();
        contenido.setFont(font, 12);
        contenido.moveTextPositionByAmount(30, 700);
        contenido.drawString(nombreEmpresa + " NIT: " + NITEmpresa);
        contenido.endText();

        contenido.beginText();
        contenido.setFont(font, 12);
        contenido.moveTextPositionByAmount(30, 680);
        contenido.drawString(direccionEmpresa);
        contenido.endText();

        contenido.beginText();
        contenido.setFont(fontNormal, 11);
        contenido.moveTextPositionByAmount(30, 650);
        contenido.drawString("Fecha:" + facturaActual.getFecha());
        contenido.endText();

        contenido.beginText();
        contenido.setFont(fontNormal, 11);
        contenido.moveTextPositionByAmount(30, 635);
        contenido.drawString("Nombre: " + cliente.getNombre());
        contenido.endText();

        contenido.beginText();
        contenido.setFont(fontNormal, 11);
        contenido.moveTextPositionByAmount(30, 620);
        contenido.drawString("Direccin: " + cliente.getDireccion());
        contenido.endText();

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(200, 590);
        contenido.drawString("DETALLE DE LA FACTURA");
        contenido.endText();

        //Dibujar lineas
        contenido.drawLine(30, 600, 500, 600);
        contenido.drawLine(30, 585, 500, 585);

        //Dibujar tabla de productos
        ControladorFactura_Productos controladorFactura_Productos = new ControladorFactura_Productos();
        ArrayList<Factura_Productos> listaProductosFactura = controladorFactura_Productos
                .getTodosFactura_Productos(" where factura_id=" + facturaID);

        contenido.drawLine(30, 570, 500, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(60, 560);
        contenido.drawString("Producto");
        contenido.endText();
        contenido.drawLine(30, 550, 30, 570);
        contenido.drawLine(200, 550, 200, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(220, 560);
        contenido.drawString("Valor unitario");
        contenido.endText();
        contenido.drawLine(300, 550, 300, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(320, 560);
        contenido.drawString("Unidades");
        contenido.endText();
        contenido.drawLine(380, 550, 380, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(400, 560);
        contenido.drawString("Valor total");
        contenido.endText();
        contenido.drawLine(500, 550, 500, 570);
        contenido.drawLine(500, 550, 500, 570);

        contenido.drawLine(30, 550, 500, 550);

        int altura = 550;
        ControladorProducto controladorProducto = new ControladorProducto();

        /*
         * Caben en la pagina
         * Primera pagina 14
         * Seguientes paginas 21
         * Footer cuenta como 5 mas
         */
        int indiceProductos = 0;
        double totalEspaciosNecesarios = listaProductosFactura.size() + 5 + 1;
        double totalPaginas = 1;

        if (Math.floor(totalEspaciosNecesarios / 17) == 0) {
            totalPaginas = 1;
        } else {
            totalEspaciosNecesarios -= 17;
            totalPaginas += (int) Math.ceil(totalEspaciosNecesarios / 21);
        }

        //Primer pagina
        for (int i = 0; i < listaProductosFactura.size() && altura >= 30; i++) {
            //Imprime por paginas
            Factura_Productos facturaProducto = listaProductosFactura.get(i);
            Productos productoActual = controladorProducto
                    .getProducto(" where producto_id=" + facturaProducto.getProducto_id()).get(0);

            String nombreProducto = productoActual.getNombre();

            if (nombreProducto.length() > 25) {
                nombreProducto = nombreProducto.substring(0, 26);
            }

            Double totalProducto = productoActual.getPrecio() * facturaProducto.getUnidades();
            NumberFormat formatter = new DecimalFormat("#0");

            String valorUnitario = String.valueOf(productoActual.getPrecio());
            String unidades = String.valueOf(facturaProducto.getUnidades());
            String valorTotal = String.valueOf(formatter.format(totalProducto));

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(40, altura - 15);
            contenido.drawString(String.valueOf(i + 1));
            contenido.endText();
            contenido.drawLine(30, altura, 30, altura - 30);
            contenido.drawLine(200, altura, 200, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(70, altura - 15);
            contenido.drawString(nombreProducto);
            contenido.endText();
            contenido.drawLine(70, altura, 70, altura - 30);
            contenido.drawLine(200, altura, 200, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(220, altura - 15);
            contenido.drawString(valorUnitario);
            contenido.endText();
            contenido.drawLine(300, altura, 300, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(320, altura - 15);
            contenido.drawString(unidades);
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(valorTotal);
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);
            //Linea inferior
            contenido.drawLine(30, altura - 30, 500, altura - 30);
            altura -= 30;
            indiceProductos = i + 1;
        }
        //Escribir footer si paginas es igual a 1
        if (totalPaginas == 1) {
            Double valor = facturaActual.getValor();
            Double ivaCalculado = Math.ceil(valor * Double.parseDouble(IVA) / 100);
            Double subtotal = Math.floor(valor * (1 - Double.parseDouble(IVA) / 100));

            NumberFormat formatter = new DecimalFormat("#0");
            String valorFormateado = formatter.format(valor);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(320, altura - 15);
            contenido.drawString("Subtotal");
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(String.valueOf(subtotal));
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);

            //Linea inferior
            contenido.drawLine(320, altura, 320, altura - 30);
            contenido.drawLine(320, altura - 30, 500, altura - 30);

            altura -= 30;
            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(320, altura - 15);
            contenido.drawString("IVA " + IVA + "%");
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(String.valueOf(ivaCalculado));
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);
            //Linea inferior
            contenido.drawLine(320, altura, 320, altura - 30);
            contenido.drawLine(320, altura - 30, 500, altura - 30);
            altura -= 30;

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(320, altura - 15);
            contenido.drawString("Total");
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(font, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(valorFormateado);
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);
            //Linea inferior
            contenido.drawLine(320, altura - 30, 500, altura - 30);
            contenido.drawLine(320, altura, 320, altura - 30);

            //Informacion legal
            altura -= 40;
            contenido.beginText();
            contenido.setFont(fontNormal, 10);
            contenido.moveTextPositionByAmount(50, altura);
            contenido.drawString(informacionLegalFactura);
            contenido.endText();

        }

        //Siguientes paginas
        for (int j = 1; j < totalPaginas; j++) {
            altura = 650;
            PDPage paginaSiguiente = new PDPage();
            document.addPage(paginaSiguiente);

            PDPageContentStream contenidoSiguiente = new PDPageContentStream(document, paginaSiguiente);
            //Escribir paginas
            for (int i = indiceProductos; i < listaProductosFactura.size() && altura >= 30; i++) {
                //Imprime por paginas
                Factura_Productos facturaProducto = listaProductosFactura.get(i);
                Productos productoActual = controladorProducto
                        .getProducto(" where producto_id=" + facturaProducto.getProducto_id()).get(0);

                String nombreProducto = productoActual.getNombre();

                if (nombreProducto.length() > 25) {
                    nombreProducto = nombreProducto.substring(0, 26);
                }

                Double totalProducto = productoActual.getPrecio() * facturaProducto.getUnidades();
                NumberFormat formatter = new DecimalFormat("#0");

                String valorUnitario = String.valueOf(productoActual.getPrecio());
                String unidades = String.valueOf(facturaProducto.getUnidades());
                String valorTotal = String.valueOf(formatter.format(totalProducto));

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(40, altura - 15);
                contenidoSiguiente.drawString(String.valueOf(i + 1));
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(30, altura, 30, altura - 30);
                contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(70, altura - 15);
                contenidoSiguiente.drawString(nombreProducto);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(70, altura, 70, altura - 30);
                contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                contenidoSiguiente.drawString(unidades);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(font, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(valorTotal);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenidoSiguiente.drawLine(30, altura - 30, 500, altura - 30);
                indiceProductos = i + 1;
                altura -= 30;
            }
            //Si no cabe mas cierre el flujo.
            if (indiceProductos < listaProductosFactura.size()) {
                contenidoSiguiente.close();
            }
            //En ultima pagina escribir footer
            if (j == totalPaginas - 1 && altura >= 40) {
                Double valor = facturaActual.getValor();
                Double ivaCalculado = Math.ceil(valor * Double.parseDouble(IVA) / 100);
                Double subtotal = Math.floor(valor * (1 - Double.parseDouble(IVA) / 100));
                NumberFormat formatter = new DecimalFormat("#0");
                String valorFormateado = formatter.format(valor);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                contenidoSiguiente.drawString("Subtotal");
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(String.valueOf(subtotal));
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);

                //Linea inferior
                contenidoSiguiente.drawLine(320, altura, 320, altura - 30);
                contenidoSiguiente.drawLine(320, altura - 30, 500, altura - 30);

                altura -= 30;
                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                contenidoSiguiente.drawString("IVA " + IVA + "%");
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(String.valueOf(ivaCalculado));
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenidoSiguiente.drawLine(320, altura, 320, altura - 30);
                contenidoSiguiente.drawLine(320, altura - 30, 500, altura - 30);
                altura -= 30;

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(320, altura - 15);
                contenidoSiguiente.drawString("Total");
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(valorFormateado);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenidoSiguiente.drawLine(320, altura - 30, 500, altura - 30);
                contenidoSiguiente.drawLine(320, altura, 320, altura - 30);

                //Informacion legal
                altura -= 40;
                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 10);
                contenidoSiguiente.moveTextPositionByAmount(50, altura);
                contenidoSiguiente.drawString(informacionLegalFactura);
                contenidoSiguiente.endText();

                contenidoSiguiente.close();
            } else {
                contenidoSiguiente.close();
            }

            System.out.println("Pagina numero: " + j + " De  " + totalPaginas);

        }

        contenido.close();
        return document;

    } catch (Exception e) {
        JOptionPane.showMessageDialog(dialogo,
                "Error al crear la factura\nInformacin Tcnica\n" + e.toString(), "Error",
                JOptionPane.ERROR_MESSAGE);
        return null;
    }

}

From source file:generarPDF.GenerarReporteDiario.java

public PDDocument crearDiario(Calendar fechaInicial, Calendar fechaFinal, DefaultTableModel modeloTabla,
        JFrame dialogo) {//from   w w  w. ja v a 2s.  c om
    PDDocument document = new PDDocument();

    try {

        PDPage pagina1 = new PDPage();
        document.addPage(pagina1);

        PDFont font = PDType1Font.HELVETICA_BOLD;
        PDFont fontNormal = PDType1Font.HELVETICA;

        PDPageContentStream contenido = new PDPageContentStream(document, pagina1);

        int annioInicial = fechaInicial.get(Calendar.YEAR);
        int mesInicial = fechaInicial.get(Calendar.MONTH) + 1;
        int diaInicial = fechaInicial.get(Calendar.DAY_OF_MONTH);

        String cadenaFechaInicial = annioInicial + "/" + mesInicial + "/" + diaInicial;

        int annioFinal = fechaFinal.get(Calendar.YEAR);
        int mesFinal = fechaFinal.get(Calendar.MONTH) + 1;
        int diaFinal = fechaFinal.get(Calendar.DAY_OF_MONTH);
        String cadenaFechaFinal = annioFinal + "/" + mesFinal + "/" + diaFinal;

        contenido.beginText();
        contenido.setFont(font, 16);
        contenido.moveTextPositionByAmount(30, 730);
        contenido.drawString("Diario, desde: " + cadenaFechaInicial + " hasta: " + cadenaFechaFinal);
        contenido.endText();

        contenido.drawLine(30, 680, 500, 680);
        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(200, 660);
        contenido.drawString("DETALLE DEL FLUJO");
        contenido.endText();
        contenido.drawLine(30, 640, 500, 640);

        /*
         * Caben en la pagina
         * Primera pagina 14
         * Seguientes paginas 21
         * Footer cuenta como 3 mas
         */
        double totalEspaciosNecesarios = modeloTabla.getRowCount() + 3 + 1;
        double totalPaginas = 1;
        int indiceProductos = 0;

        if (Math.floor(totalEspaciosNecesarios / 20) == 0) {
            totalPaginas = 1;
        } else {
            totalEspaciosNecesarios -= 20;
            totalPaginas += (int) Math.ceil(totalEspaciosNecesarios / 24);
        }

        /*
         Encabezado tabla
         */
        contenido.drawLine(30, 620, 500, 620);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(60, 605);
        contenido.drawString("Nmero factura");
        contenido.endText();
        contenido.drawLine(30, 600, 30, 620);
        contenido.drawLine(200, 600, 200, 620);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(220, 605);
        contenido.drawString("Fecha");
        contenido.endText();
        contenido.drawLine(300, 600, 300, 620);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(320, 605);
        contenido.drawString("Tipo");
        contenido.endText();
        contenido.drawLine(380, 600, 380, 620);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(400, 605);
        contenido.drawString("Valor");
        contenido.endText();
        contenido.drawLine(500, 600, 500, 620);
        contenido.drawLine(500, 600, 500, 620);

        contenido.drawLine(30, 600, 500, 600);

        int altura = 600;
        /*
         Generar informes
         */
        for (int i = 0; i < modeloTabla.getRowCount() && altura >= 30; i++) {
            //Imprime por paginas

            String numeroFactura = String.valueOf(modeloTabla.getValueAt(i, 1));
            String fecha = String.valueOf(modeloTabla.getValueAt(i, 2));
            fecha = fecha.substring(0, 10);
            String tipo = String.valueOf(modeloTabla.getValueAt(i, 3));
            String valor = String.valueOf(modeloTabla.getValueAt(i, 4));

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(40, altura - 15);
            contenido.drawString(numeroFactura);
            contenido.endText();

            contenido.drawLine(30, altura, 30, altura - 30);
            contenido.drawLine(200, altura, 200, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(220, altura - 15);
            contenido.drawString(fecha);
            contenido.endText();

            contenido.drawLine(300, altura, 300, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(330, altura - 15);
            contenido.drawString(tipo);
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(420, altura - 15);
            contenido.drawString(valor);
            contenido.endText();

            contenido.drawLine(500, altura, 500, altura - 30);

            //Linea inferior
            contenido.drawLine(30, altura - 30, 500, altura - 30);
            altura -= 30;
            indiceProductos = i + 1;
        }
        //Escribir paginas siguientes

        for (int j = 1; j < totalPaginas; j++) {
            altura = 600;
            PDPage paginaSiguiente = new PDPage();
            document.addPage(paginaSiguiente);
            PDPageContentStream contenidoSiguiente = new PDPageContentStream(document, paginaSiguiente);

            for (int i = indiceProductos; i < modeloTabla.getRowCount() && altura >= 30; i++) {
                //Imprime por paginas

                String numeroFactura = String.valueOf(modeloTabla.getValueAt(i, 1));
                String fecha = String.valueOf(modeloTabla.getValueAt(i, 2));
                fecha = fecha.substring(0, 10);
                String tipo = String.valueOf(modeloTabla.getValueAt(i, 3));
                String valor = String.valueOf(modeloTabla.getValueAt(i, 4));

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(40, altura - 15);
                contenidoSiguiente.drawString(numeroFactura);
                contenidoSiguiente.endText();

                contenidoSiguiente.drawLine(30, altura, 30, altura - 30);
                contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(220, altura - 15);
                contenidoSiguiente.drawString(fecha);
                contenidoSiguiente.endText();

                contenidoSiguiente.drawLine(300, altura, 300, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(330, altura - 15);
                contenidoSiguiente.drawString(tipo);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(420, altura - 15);
                contenidoSiguiente.drawString(valor);
                contenidoSiguiente.endText();

                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);

                //Linea inferior
                contenidoSiguiente.drawLine(30, altura - 30, 500, altura - 30);
                altura -= 30;
                indiceProductos = i + 1;
            }
            contenidoSiguiente.close();
        }

        contenido.close();

    } catch (Exception e) {
        JOptionPane.showMessageDialog(dialogo,
                "Se ha presentado un error al generar el diario\nInformacin tcnica\n" + e.toString());
    }
    return document;
}

From source file:generarPDF.ReporteFlujosCliente.java

private PDDocument crearInformeMovimientosCliente(ArrayList<Integer> flujosID, int cliente_id,
        Calendar fechaInicial, Calendar fechaFinal) {

    try {/*from  w  w  w  .j  a v  a 2s  .c o  m*/

        ControladorCliente controladorCliente = new ControladorCliente();
        Cliente cliente = controladorCliente.obtenerClientePorID(cliente_id);

        PDDocument document = new PDDocument();

        PDPage pagina1 = new PDPage();
        document.addPage(pagina1);

        PDFont font = PDType1Font.HELVETICA_BOLD;
        PDFont fontNormal = PDType1Font.HELVETICA;

        PDPageContentStream contenido = new PDPageContentStream(document, pagina1);

        contenido.beginText();
        contenido.setFont(font, 16);
        contenido.moveTextPositionByAmount(30, 730);
        contenido.drawString("Reporte de movimientos del cliente");
        contenido.endText();

        contenido.beginText();
        contenido.setFont(font, 12);
        contenido.moveTextPositionByAmount(30, 700);
        contenido.drawString("Minimarket Barrio Nuevo.       NIT: 1234567898-9");
        contenido.endText();

        contenido.beginText();
        contenido.setFont(font, 12);
        contenido.moveTextPositionByAmount(30, 680);
        contenido.drawString("Calle Falsa 1 2 3");
        contenido.endText();

        Calendar fecha = new GregorianCalendar();
        //Obtenemos el valor del ao, mes, da,
        //hora, minuto y segundo del sistema
        //usando el mtodo get y el parmetro correspondiente
        int annio = fecha.get(Calendar.YEAR);
        int mes = fecha.get(Calendar.MONTH);
        int dia = fecha.get(Calendar.DAY_OF_MONTH);

        contenido.beginText();
        contenido.setFont(fontNormal, 11);
        contenido.moveTextPositionByAmount(30, 650);
        contenido.drawString("Fecha: " + annio + "/" + (mes + 1) + "/" + dia);
        contenido.endText();

        contenido.beginText();
        contenido.setFont(fontNormal, 11);
        contenido.moveTextPositionByAmount(30, 635);
        contenido.drawString("Nombre: " + cliente.getNombre());
        contenido.endText();

        contenido.beginText();
        contenido.setFont(fontNormal, 11);
        contenido.moveTextPositionByAmount(30, 620);
        contenido.drawString("Direccin: " + cliente.getDireccion());
        contenido.endText();

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(110, 590);

        SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
        String formattedInicial = formato.format(fechaInicial.getTime());
        String formattedFinal = formato.format(fechaFinal.getTime());

        contenido.drawString("DETALLE DE LOS MOVIMIENTOS entre: " + formattedInicial + " y " + formattedFinal);
        contenido.endText();

        //Dibujar lineas
        contenido.drawLine(30, 600, 500, 600);
        contenido.drawLine(30, 585, 500, 585);

        contenido.drawLine(30, 570, 500, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(60, 560);
        contenido.drawString("Factura");
        contenido.endText();
        contenido.drawLine(30, 550, 30, 570);
        contenido.drawLine(200, 550, 200, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(220, 560);
        contenido.drawString("Tipo flujo");
        contenido.endText();
        contenido.drawLine(300, 550, 300, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(320, 560);
        contenido.drawString("Fecha");
        contenido.endText();
        contenido.drawLine(380, 550, 380, 570);

        contenido.beginText();
        contenido.setFont(fontNormal, 12);
        contenido.moveTextPositionByAmount(400, 560);
        contenido.drawString("Valor");
        contenido.endText();
        contenido.drawLine(500, 550, 500, 570);
        contenido.drawLine(500, 550, 500, 570);

        contenido.drawLine(30, 550, 500, 550);

        int altura = 550;
        /*
         * Caben en la pagina
         * Primera pagina 14
         * Seguientes paginas 21
         * Footer cuenta como 3 mas
         */
        int indiceProductos = 0;
        double totalEspaciosNecesarios = flujosID.size() + 3 + 1;
        double totalPaginas = 1;

        if (Math.floor(totalEspaciosNecesarios / 17) == 0) {
            totalPaginas = 1;
        } else {
            totalEspaciosNecesarios -= 17;
            totalPaginas += (int) Math.ceil(totalEspaciosNecesarios / 21);
        }
        double abonos = 0.0;
        double deudas = 0.0;
        for (int i = 0; i < flujosID.size(); i++) {
            ControladorFlujoFactura controladorFlujoFactura = new ControladorFlujoFactura();
            Flujo_Factura flujoFactura = controladorFlujoFactura
                    .getFlujo_Factura(" where flujo_id=" + flujosID.get(i));

            if (flujoFactura.getTipo_flujo().equals("abono")) {
                abonos += flujoFactura.getValor();
            } else {
                deudas += flujoFactura.getValor();
            }
        }
        //Primer pagina
        for (int i = 0; i < flujosID.size() && altura >= 30; i++) {
            //Imprime por paginas
            ControladorFlujoFactura controladorFlujoFactura = new ControladorFlujoFactura();
            Flujo_Factura flujoFactura = controladorFlujoFactura
                    .getFlujo_Factura(" where flujo_id=" + flujosID.get(i));

            String facturaID = String.valueOf(flujoFactura.getFactura_id());

            if (facturaID.length() > 25) {
                facturaID = facturaID.substring(0, 26);
            }

            String tipoFlujo = flujoFactura.getTipo_flujo();

            String fechaFlujo = flujoFactura.getFecha();
            fechaFlujo = fechaFlujo.substring(0, 10);
            String valorTotal = String.valueOf(flujoFactura.getValor());

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(40, altura - 15);
            contenido.drawString(String.valueOf(i + 1));
            contenido.endText();
            contenido.drawLine(30, altura, 30, altura - 30);
            contenido.drawLine(200, altura, 200, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(70, altura - 15);
            contenido.drawString(facturaID);
            contenido.endText();
            contenido.drawLine(70, altura, 70, altura - 30);
            contenido.drawLine(200, altura, 200, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(220, altura - 15);
            contenido.drawString(tipoFlujo);
            contenido.endText();
            contenido.drawLine(300, altura, 300, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(310, altura - 15);
            contenido.drawString(fechaFlujo);
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(valorTotal);
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);
            //Linea inferior
            contenido.drawLine(30, altura - 30, 500, altura - 30);
            altura -= 30;
            indiceProductos = i + 1;
        }
        //Escribir footer si paginas es igual a 1
        if (totalPaginas == 1) {
            Double valor = abonos - deudas;

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(300, altura - 15);
            contenido.drawString("Abonado por el cliente");
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(String.valueOf(abonos));
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);

            //Linea inferior
            contenido.drawLine(300, altura, 300, altura - 30);
            contenido.drawLine(300, altura - 30, 500, altura - 30);

            altura -= 30;
            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(300, altura - 15);
            contenido.drawString("Prestado al cliente");
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(String.valueOf(deudas));
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);
            //Linea inferior
            contenido.drawLine(300, altura, 300, altura - 30);
            contenido.drawLine(300, altura - 30, 500, altura - 30);
            altura -= 30;

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(300, altura - 15);
            contenido.drawString("Total flujos");
            contenido.endText();
            contenido.drawLine(380, altura, 380, altura - 30);

            contenido.beginText();
            contenido.setFont(font, 12);
            contenido.moveTextPositionByAmount(400, altura - 15);
            contenido.drawString(String.valueOf(valor));
            contenido.endText();
            contenido.drawLine(500, altura, 500, altura - 30);
            //Linea inferior
            contenido.drawLine(300, altura - 30, 500, altura - 30);
            contenido.drawLine(300, altura, 300, altura - 30);

        }

        //Siguientes paginas
        for (int j = 1; j < totalPaginas; j++) {
            altura = 650;
            PDPage paginaSiguiente = new PDPage();
            document.addPage(paginaSiguiente);

            PDPageContentStream contenidoSiguiente = new PDPageContentStream(document, paginaSiguiente);
            //Escribir paginas
            for (int i = indiceProductos; i < flujosID.size() && altura >= 30; i++) {
                //Imprime por paginas
                //Imprime por paginas
                ControladorFlujoFactura controladorFlujoFactura = new ControladorFlujoFactura();
                Flujo_Factura flujoFactura = controladorFlujoFactura
                        .getFlujo_Factura(" where flujo_id=" + flujosID.get(i));

                String facturaID = String.valueOf(flujoFactura.getFactura_id());

                if (facturaID.length() > 25) {
                    facturaID = facturaID.substring(0, 26);
                }

                String tipoFlujo = flujoFactura.getTipo_flujo();

                String fechaFlujo = flujoFactura.getFecha();
                fechaFlujo = fechaFlujo.substring(0, 10);
                String valorTotal = String.valueOf(flujoFactura.getValor());

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(40, altura - 15);
                contenidoSiguiente.drawString(String.valueOf(i + 1));
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(30, altura, 30, altura - 30);
                contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(70, altura - 15);
                contenidoSiguiente.drawString(facturaID);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(70, altura, 70, altura - 30);
                contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(220, altura - 15);
                contenidoSiguiente.drawString(tipoFlujo);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(300, altura, 300, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(310, altura - 15);
                contenidoSiguiente.drawString(fechaFlujo);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(valorTotal);
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenidoSiguiente.drawLine(30, altura - 30, 500, altura - 30);
                altura -= 30;
                indiceProductos = i + 1;
            }
            //Si no cabe mas cierre el flujo.
            if (indiceProductos < flujosID.size()) {
                contenidoSiguiente.close();
            }
            //En ultima pagina escribir footer
            if (j == totalPaginas - 1 && altura >= 40) {
                Double valor = abonos - deudas;

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(300, altura - 15);
                contenidoSiguiente.drawString("Abonado por el cliente");
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(String.valueOf(abonos));
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);

                //Linea inferior
                contenidoSiguiente.drawLine(300, altura, 300, altura - 30);
                contenidoSiguiente.drawLine(300, altura - 30, 500, altura - 30);

                altura -= 30;
                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(300, altura - 15);
                contenidoSiguiente.drawString("Prestado al cliente");
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(String.valueOf(deudas));
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenidoSiguiente.drawLine(300, altura, 300, altura - 30);
                contenidoSiguiente.drawLine(300, altura - 30, 500, altura - 30);
                altura -= 30;

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(fontNormal, 12);
                contenidoSiguiente.moveTextPositionByAmount(300, altura - 15);
                contenidoSiguiente.drawString("Total flujo");
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                contenidoSiguiente.beginText();
                contenidoSiguiente.setFont(font, 12);
                contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                contenidoSiguiente.drawString(String.valueOf(valor));
                contenidoSiguiente.endText();
                contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenidoSiguiente.drawLine(300, altura - 30, 500, altura - 30);
                contenidoSiguiente.drawLine(300, altura, 300, altura - 30);

                contenidoSiguiente.close();
            } else {
                contenidoSiguiente.close();
            }

            System.out.println("Pagina numero: " + j + " De  " + totalPaginas);

        }

        contenido.close();
        return document;

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Error al crear la factura ", "Error", JOptionPane.ERROR_MESSAGE);
        return null;
    }

}