The Newbie
The Newbie

Reputation: 161

Having three columns layout in PDF using itext7

I am new to itext7.
I saw an example about columndocumentrenderer. code below.

package com.itextpdf.highlevel.chapter02;

import com.itextpdf.io.font.FontConstants;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.ColumnDocumentRenderer;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.AreaBreak;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.hyphenation.HyphenationConfig;
import com.itextpdf.layout.property.AreaBreakType;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.test.annotations.WrapToTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 * @author RNDPC-03
 */@WrapToTest
 public class C02E08_JekyllHydeV4 {


     public static final String SRC = "src/main/resources/txt/jekyll_hyde.txt";
     public static final String DEST = "results/chapter02/jekyll_hyde_v4.pdf";

     public static void main(String args[]) throws IOException {
         File file = new File(DEST);
         file.getParentFile().mkdirs();
         new C02E08_JekyllHydeV4().createPdf(DEST);
     }

     public void createPdf(String dest) throws IOException {
         //Initialize PDF document
         PdfDocument pdf = new PdfDocument(new PdfWriter(dest));

         // Initialize document
         Document document = new Document(pdf);

         //Set column parameters
         float offSet = 36;
         float gutter = 23;
         float columnWidth = (PageSize.A4.getWidth() - offSet * 2) / 2 - gutter;
         float columnHeight = PageSize.A4.getHeight() - offSet * 2;

         //Define column areas
         Rectangle[] columns = {
             new Rectangle(offSet, offSet, columnWidth, columnHeight),
             new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight)};
         document.setRenderer(new ColumnDocumentRenderer(document, columns));    

         PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
         PdfFont bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
         document.setTextAlignment(TextAlignment.JUSTIFIED)
             .setFont(font)
             .setHyphenation(new HyphenationConfig("en", "uk", 3, 3));

         BufferedReader br = new BufferedReader(new FileReader(SRC));
         String line;
         Paragraph p;
         boolean title = true;
         AreaBreak nextArea = new AreaBreak(AreaBreakType.NEXT_AREA);
         while ((line = br.readLine()) != null) {
             p = new Paragraph(line);
             if (title) {
                 p.setFont(bold).setFontSize(12);
                 title = false;
             }
             else {
                 p.setFirstLineIndent(36);
             }
             if (line.isEmpty()) {
                 document.add(nextArea);
                 title = true;
             }
             document.add(p);
         }

         //Close document
         document.close();
     }
} 

now this will have a result of this . picture below

enter image description here

now I want to make it into a three(3) column. how to do this? please anyone? or just guide me. thank you!

Upvotes: 1

Views: 1800

Answers (1)

Bruno Lowagie
Bruno Lowagie

Reputation: 77528

Here is where you define two columns:

float offSet = 36;
float gutter = 23;
float columnWidth = (PageSize.A4.getWidth() - offSet * 2) / 2 - gutter;
float columnHeight = PageSize.A4.getHeight() - offSet * 2;

//Define column areas
Rectangle[] columns = {
    new Rectangle(offSet, offSet, columnWidth, columnHeight),
    new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight)};

Changing this to three columns is a no-brainer.

Just replace all of the above by something like this:

Rectangle[] columns = {
    new Rectangle(20, 20, 180, 802),
    new Rectangle(207, 15, 180, 802),
    new Rectangle(394, 15, 180, 802) };

Now that columns has three Rectangle elements, three columns will be drawn. Feel free to adapt the values of x, y, width and height in the Rectangle constructor if the three columns don't have the desired size.

Upvotes: 2

Related Questions