In this post, I would like to show how to load font files and format specific sections of the document at run time, when generating PDF document using Flying Saucer and iText libraries.
I will create a String that has a structure of valid XHTML file. The content of String is what going to be generated as a PDF document. Flying Saucer knows how to render XHTML. Before generating the PDF, I will load a font file for future formatting. Once the font file is loaded, I will retrieve the font family and will apply it as a formatting style to the selected paragraph of my future PDF document.
import java.io.*;
import com.lowagie.text.pdf.*;
import org.xhtmlrenderer.pdf.*;
public class TestFont {
public static void main(String[] args) {
try {
ITextRenderer renderer = new ITextRenderer();
File fontDir = new File(SOME_ABSOLUTE_PATH_TO_YOUR_FONT_DIR);
//Build valid XHTML source for parsing
StringBuffer buf = new StringBuffer();
buf.append("<html>");
buf.append("<head>");
buf.append("</head>");
buf.append("<body>");
String body = "This is formatted paragraph";
//Gets TTF or OTF font file from
//the font directory
if (fontDir.isDirectory()) {
//Only add fonts with specific extensions
File[] files = fontDir.listFiles( new FilenameFilter() {
public boolean accept(File dir, String name) {
String lower = name.toLowerCase();
//Load TTF or OTF files
return lower.endsWith(".otf") || lower.endsWith(".ttf");
}
});
if (files.length > 0) {
String fontFamilyName = "";
//You should always embed TrueType fonts.
renderer.getFontResolver().addFont(files[0].getAbsolutePath(),
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//Get font family name from the BaseFont object.
//All this work just to get font family name
BaseFont font = BaseFont.createFont(files[0].getAbsolutePath(),
BaseFont.IDENTITY_H , BaseFont.NOT_EMBEDDED);
fontFamilyName = TrueTypeUtil.
getFamilyName(font);
if (!fontFamilyName.equals("")) {
//Wrap DIV with font family name around the content
body = "<div style=\"font-family: " + fontFamilyName + ";\">" + body + "</div>";
}
}
}
buf.append("<p>This paragraph is unformatted</p>");
buf.append("<p>" + body + "</p>");
buf.append("</body>");
buf.append("</html>");
byte[] bytes = buf.toString().getBytes("UTF-8");
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource(bais);
Document doc = builder.parse(is);
renderer.setDocument(doc, null);
renderer.layout();
String filename = "document.pdf";
BufferedOutputStream bufferedOutput = new BufferedOutputStream(new
FileOutputStream(filename));
renderer.createPDF(bufferedOutput);
bufferedOutput.flush();
bufferedOutput.close();
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
I hope by looking at the source code, the concept of how to add fonts and retrieve font family was clear.
Regards,
Alex
loading...
Related posts:
- Export Pebble Blog Entry to PDF Plugin
In one of my previous posts, I described how I implemented a plug in for Pebble blogging software that allows export of blog... - Export to PDF using iText and Flying Saucer
In my previous post I attempted to generate PDF on the fly using iText library. My goal was to parse HTML snippet into... - Online PDF Generator
Online PDF generator now available. This simple but useful online PDF generator tool allows you to generate PDF document online from HTML snippets.... - Up and Running Again
For the past thirteen days Java Beans dot Asia was offline. Normally I would not care, but in this case I was a... - Export to PDF Using iText Java-PDF Library
I had some time during this weekend, so I used iText, free Java-PDF library to make a plug in for Pebble blogging software....

Generate PDF with Flying Saucer and iText by adding font files: In this post, I would like to show how to lo… http://tinyurl.com/yb54kgs
loading...
Generate PDF with Flying Saucer and iText by adding font files: In this post, I would like to show how to lo… http://tinyurl.com/yb54kgs
loading...
Generate PDF with Flying Saucer and iText by adding font files: In this post, I would like to show how to load fon… http://bit.ly/9KmswI
loading...