Export to GitHub

flying-saucer - issue #258

Allow a way for setting page size, page margins from Java code


Posted on Mar 10, 2015 by Happy Lion

What steps will reproduce the problem? 1. Create MyPDFPageEvents class as below

public class MyPDFPageEvents extends PdfPageEventHelper { ...//not all methods are listed here public void onStartPage(PdfWriter writer, Document document) { document.setPageSize(PageSize.A5); document.setMargins(100, 100, 100, 100); } ... }

  1. Create FlyingSaucerPDFCreationListener class as below import org.xhtmlrenderer.pdf.ITextRenderer; import org.xhtmlrenderer.pdf.PDFCreationListener;

import test.pdf.MyPDFPageEvents;

public class FlyingSaucerPDFCreationListener implements PDFCreationListener { MyPDFPageEvents pdfPageEvents = null;

public FlyingSaucerPDFCreationListener(MyPDFPageEvents mppe) {
    pdfPageEvents=mppe;
}

@Override
public void preOpen(ITextRenderer iTextRenderer) {
    System.out.println("preOpen("+iTextRenderer+")");
    // set the PdfPageEvent instance to the PdfWriter
    iTextRenderer.getWriter().setPageEvent(pdfPageEvents);
}

@Override
public void preWrite(ITextRenderer iTextRenderer, int pageCount) {
    System.out.println("preWrite("+iTextRenderer+", "+pageCount+")");
}

@Override
public void onClose(ITextRenderer renderer) {
    System.out.println("onClose("+renderer+")");
}

}

  1. Call everything from another class's main method to generate PDF from HTML

public static void main(String[] args) throws IOException, DocumentException { InputStream is = FlyingSaucerPdfRenderer.class.getResourceAsStream("/sample-html.html"); String fileHTML = getStringFromInputStream(is);

String cleanedHTML = cleanHTML(fileHTML);

// Create the PDF
MyITextRenderer renderer = new MyITextRenderer();
MyPDFPageEvents mppe = new MyPDFPageEvents(renderer);
FlyingSaucerPDFCreationListener fspcl = new FlyingSaucerPDFCreationListener(mppe);
renderer.setListener(fspcl);
renderer.setDocumentFromString(cleanedHTML);
renderer.layout();
OutputStream outputStream = new FileOutputStream("FlyingSaucer-HTMLtoPDF.pdf");
renderer.createPDF(outputStream);

// Finishing up
renderer.finishPDF();

}

What is the expected output? - A PDF generated with A5 page size

What do you see instead? - A PDF generated with the default A4 page size

What version of the product are you using? - flying-saucer-core-9.0.7.jar - flying-saucer-pdf-9.0.7.jar - iText-2.1.5.jar

On what operating system? - Windows 7

Please provide any additional information below. - Want to use HTML formatting except the page size in generated PDF - Wanted a feature using which we can override page size, margins of CSS and pass it through the Java code. And flying saucer library should use this page information while generating PDF.

Comment #1

Posted on Mar 10, 2015 by Happy Lion

One important requirement in above is to be able to specify different page size and margin for each page from Java code. e.g. Page 1: size=A5, Margin=100,100,100,100 and Page 2: size=A3, Margin=150,50,50,200 Updated code for MyPDFPageEvents public class MyPDFPageEvents extends PdfPageEventHelper { ...//not all methods are listed here public void onStartPage(PdfWriter writer, Document document) { Rectangle pageSize = PageSize.A4; float ml = 50, mr = 50, mt = 50, mb = 50; int pageNo = document.getPageNumber() % 5; switch (pageNo) { case 1: pageSize = PageSize.A4; ml = 200; mr = 100; mt = 200; mb = 100; break; case 2: pageSize = PageSize.A4; pageSize = pageSize.rotate();// portrait to landscape ml = 250; mr = 250; mt = 50; mb = 50; break; case 3: ...// more page configurations... break; ...// more page configurations... default: pageSize = PageSize.A4; ml = 50; mr = 50; mt = 50; mb = 50; } document.setPageSize(pageSize); document.setMargins(ml, mr, mt, mb); } ... }

Status: New

Labels:
Type-Defect Priority-Medium