Amogh
Amogh

Reputation: 4573

continuing text to next page

I want to generate a PDF of questions and their options using iText. I am able to generate the PDF but the problem is sometimes questions get printed at the end of a page and options go to the next page.

How can I determine that a question and its option will not fit in the same page?

This means that if question and options will not fit in the same page then that they must be placed on the next page.

UPDATED

com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4,50,50,15,15);          
ByteArrayOutputStream OutputStream = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, OutputStream);
document.open();
Paragraph paragraph = new Paragraph("Paper Name Here",new Font(FontFamily.TIMES_ROMAN,15,Font.BOLD));
paragraph.setAlignment(Element.ALIGN_CENTER);
document.add(paragraph);
document.addTitle("Paper Name Here");       
document.addAuthor("corp");
com.itextpdf.text.List list = new com.itextpdf.text.List(true);

for (long i = 1; i <= 20 ; i++) 
{
    List<MultipleChoiceSingleCorrect> multipleChoiceSingleCorrects = new MultipleChoiceSingleCorrectServicesImpl().getItemDetailsByItemID(i);
    for (MultipleChoiceSingleCorrect multipleChoiceSingleCorrect : multipleChoiceSingleCorrects) {
        list.add(multipleChoiceSingleCorrect.getItemText());                    
        RomanList oplist = new RomanList();             
        oplist.setIndentationLeft(20);                      
        for (OptionSingleCorrect optionSingleCorrect : multipleChoiceSingleCorrect.getOptionList()) {
            oplist.add(optionSingleCorrect.getOptionText());
        }
        list.add(oplist);
    }
}        
document.add(list);
document.close();

after this I m getting abnormal page brakes means some times question is at end of page and option jumps to next page.(AS shown in image below)

enter image description here

Upvotes: 1

Views: 3273

Answers (2)

Amogh
Amogh

Reputation: 4573

with the help of Alexis Pigeon I done with this code. So special thanks to him.

I have added question text to Paragraph after that all options kept in an list. Option list opList added in paragraph, this paragraph add to an ListItem and this ListItem added to an master list.

This way question splitting on two pages is resolved but I m not getting question numbers.. I already set master list as numbered=true com.itextpdf.text.List list = new com.itextpdf.text.List(true);

Code:-

    try {
        String Filename="PaperName.pdf";
        com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4,50,50,15,15);          
        ByteArrayOutputStream OutputStream = new ByteArrayOutputStream();
        PdfWriter writer = PdfWriter.getInstance(document, OutputStream);           
        document.open();
        Paragraph paragraph = new Paragraph("Paper Name Here",new Font(FontFamily.TIMES_ROMAN,15,Font.BOLD));
        paragraph.setAlignment(Element.ALIGN_CENTER);           
        paragraph.setSpacingAfter(20);      
        document.add(paragraph);
        document.addTitle("Paper Name Here");       
        document.addAuthor("crop");
        document.addCreator("crop");
        com.itextpdf.text.List list = new com.itextpdf.text.List(true);
        for (long i = 1; i <= 20 ; i++) 
        {
            List<MultipleChoiceSingleCorrect> multipleChoiceSingleCorrects = new MultipleChoiceSingleCorrectServicesImpl().getItemDetailsByItemID(i);
            for (MultipleChoiceSingleCorrect multipleChoiceSingleCorrect : multipleChoiceSingleCorrects) {
                Paragraph paragraph2 =new Paragraph();
                paragraph2.setKeepTogether(true);
                paragraph2.add(multipleChoiceSingleCorrect.getItemText());
                paragraph2.add(Chunk.NEWLINE);
                RomanList oplist = new RomanList();             
                oplist.setIndentationLeft(20);                      
                for (OptionSingleCorrect optionSingleCorrect : multipleChoiceSingleCorrect.getOptionList()) {                       
                    oplist.add(optionSingleCorrect.getOptionText());
                }
                paragraph2.add(oplist); 
                paragraph2.setSpacingBefore(20);                    
                ListItem listItem =new ListItem();
                listItem.setKeepTogether(true);
                listItem.add(paragraph2);
                list.add(listItem);
            }
        }
        document.add(list);
        document.close();
        response.setContentLength(OutputStream.size());
        response.setContentType("application/pdf");
        response.setHeader("Content-disposition", "attachment; filename=" + Filename);
        ServletOutputStream out = response.getOutputStream();
        OutputStream.writeTo(out);
        out.flush();
        } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }   

enter image description here

Upvotes: 1

Alexis Pigeon
Alexis Pigeon

Reputation: 7522

What you are interested in are the setKeepTogether(boolean) methods :

This will keep the object in one page, forcing the creation of a new page if the content doesn't fit in the remaining page.

Upvotes: 1

Related Questions