Generate PDF with Flying Saucer and iText by Adding Font Files

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

Enriching Rich Internet Applications with Rule-Based Reasoning

I came across a Firefox Add-On today by Matthias Tylkowski, that lets user to modify the browser view of his/her preferred web pages. For example, user can modify the appearance of cnn.com to suit his/her needs.

The add-on or the web rules is a JSON-based rule language, where each rule is a JSON object. In addition, Javascript is used for method calls. The web rules use Drools-like condition language:

{
    &quot;id&quot;:&quot;rule101&quot;,  &quot;appliesTo&quot;: [
              &quot;http://www.cnn.com&quot;],
               &quot;condition&quot;:  &quot;$X:Element( class == 'note', $Y:firstChild ) &amp;&amp;
                              ($Y.nodeName == 'ul')&quot;,
               &quot;actions&quot;:[  &quot;changeBackground($Y, 'blue')&quot;   ]
}

For all elements of class note having as first child an ul, change the first child background color to blue.

I think its a quite cool add-on.

Resources:
JSON RuleS

Работать будучи студентом в Австралии

В последнее время участились вопросы по этой теме: А могу ли я то… а могу ли я это… а что можно… и так далее.

Я попытаюсь описать реальность поиска работы будучи студентом в Австралии. Я сам был студентом здесь и у меня есть/было много друзей студентов, так что считаю что мое мнение довольно обьективное. В конце концов моё дело написать – ваше дело прочитать. Tакже я хотел бы чтоб некоторые студенты в Австралии здесь поделились бы похожим.

Сколько часов можно мне работать?
Работать можно не более 20 часов в неделю. Не важно сколько работаешь в день, главное чтоб не более 20 часов в неделю.


А что и как в плане налогов для интернациональных студентов?

Интернациональные студенты как платильщеки налогов, считаются обладателями ПМЖ в целях уплаты налогов, если(!) ваш курс/обучение длится шесть (6) месяцев или дольше. То есть плотите налоги как Австралы. Поэтому когда будете заполнять форму для налогов на работе, укажите там что вы “Australian residents for tax purposes”, если ваш курс/обучение длится шесть (6) месяцев или дольше.

“… Generally, you are an Australian resident for tax purposes if you have:
1. always lived in Australia
2. moved to Australia and live here permanently
3. been in Australia continuously for six months or more and for most of the time you have been
3.a in the one job, and

3.b living in the same place …”

From Residency – overview (Australian Taxation Office)

В связи с кризисом, стало ли меньше подработок?
Да, конечно… В какой то степени да

Я у себя в стране был(а) супер-пупер специалист по радио-технике/ мэнэджмэнту/ маркетингу/ коммуникациям/программированию,
смогу ли я устроиться по проффесии на время обучения?

Почти с уверенностью скажу что не сможете. Почему “почти”? Потому что вдруг вам жутко жутко жутко повезёт и вам кто-то поможет по знакомству, что бывает крайне редко. Почему всё таки не сможете? Ну давайте посмотрим на вас со стороны:

  1. ПМЖ нет (самая главная причина). Никого также не интересует что оно (ПМЖ), может быть будет у вас через пару лет
  2. Работать можете не более 20 часов
  3. Наверняка ваш уровень English оставляет о себе желать лучшего

Подумайте, ну зачем работодателю морочиться с вами? Ему нужны работники на полную ставку, а не те с которыми надо возиться пол-недели и которые скорее всего уедут домой через какое-то количество времени.

Также не забывайте что тут уже есть конкуренция на серьёзные работы в лице местных студентов у которых English родной язык, и которых нет ограничения в часах. Всё равно даже этим студентам практически невозможно устроиться, так как они студенты… а тут ещё вы без ПМЖ, и с ограниченим на работу … понимаете ситуацию?

Ещё один важный фактор:
На серьёзные работы здесь рассылаются резюме через email. Эти резюме скорее всего попадут к агенство по работе нанятым компанией, или просто в отдел кадров самой компании, служащие которых и там и там, поспешат отложить/стереть/выкинуть ваше резюме интернационального студента.

Если вы решите не указывать статусы интернационального студента и ПМЖ в резюме, это всё проясниться когда к вам перезвонять (если к вам перезвонять).

Не подумайте что я вас отговориваю здесь – пытайтесь, дерзайте, рассылайте резюме … а вдруг? :)

На какие работы дествительно можно расчитывать?

Пабы, рестораны, клубы, магазины, супермаркеты и так далее. Можно сделать taxi license и подрабатывать таксистом. Можно сделать security guard license и подрабатывать охранником(ицей) в торговых центрах. Оссобо здоровые ребята могут попасть в охрану клубов. Попробовать также всякие заводики в плане физ-работы. Работа по подсчёту пассажиров в электричках и автобусах.

У девчонок не много опций (во всяком случае, много я не вижу): продавщица, оффициантка, горничными в гостиницах/мотелях и также любая не физ-работа. Более смелые девчонки работают как exotic dancers, но таких немного.

А как насчёт работать на “наших”?

Через “своих” работу найти быстрее всего. Не буду всех чесать под одни грабли – есть хорошие люди на этом свете. Но обычно “свои” “своих” эксплуатируют: платят мало, долгие часы работы и дают понять что это было вааще одолжение, и так как у вас безвыходное положение вы должны быть только благодарны.

Собираюсь ехать учиться на пару месяцев, могу ли в течении обучения найти работу по быстрячку?

Несколько месяцев уйдут только на адаптацию к стране и языку, и самому поиску работы. Не забывайте что вам надо учиться, и у вас не будет куча свободного времени искать работу (да и пока что-то “прострелит”) … так что думаю по быстрячку не получиться, разве что если повезёт.

Ну блин, так можно будет найти работу или нет?
Можно будет. Надо не лениться и обивать пороги/раздавать резюме … Займет время (будьте готовы на несколько месяцев), но что-то где-то “прострелит”

Ну хорошо, есть работа … На что можно расчитывать в плане зарплаты, и на что этого хватит?
Хороший вопрос. Предположим что вам очень повезло и вы нашли работу на ВСЕ 20 часов в неделю (а ведь бывает что найдешь работу на меньше), по 20(!) баков в час (это очень классная подработка – 400 баков в неделю студентом, но заметьте: я взял один из оптимальных вариантов с хорошей зарплатой).

После вычета налогов останется где-то 360 баков. Учёбу этим не оплатишь, но зато хватит сполна на недельный рент (shared accommodation, скажем 200 баков в неделю, это будет хороший sharing), на еду на неделю (100 баков на одного в неделю это выше крыши, готовить дома и несколько раз в неделю кушать в ресторанчиках/кафешках) и ещё осталось 60 баков на всякое. Вот так примерно, я думаю теперь сможете немного прицениться …

А что насчёт работ по чёрному?
Ну, я не по этой части … Знаю ребята работают на стройках, гипсовые стенки, рестораны, но это уже со “своими” надо дело иметь (иногда с местными тоже). Также знаю что хорошо имеют на продаже картин от двери до двери …

Happy Chinese New Year

I have been inactive for the past several months and haven’t posted anything. There were some transitions going on lately in my company, so I have not felt like posting anything nor I was involved in any interesting projects.

These days, I am traveling through South East Asia with my girlfriend. I have been exploring Malaysia and what this country has to offer, especially the amazing local cuisine. I think I am very lucky to have local people to take me around to all those wonderful places where Western tourists do not visit (or hardly ever visit). Few days ago we came back from Thailand, we have spent there four days. Now, as I am writing the current post, I am relaxing at my girlfriend’s house, in Shah Alam, Selangor, Malaysia.

With this post I want to start the year 2010 by wishing you all a Happy Chinese New Year. May this year will be a prosperous year to you all.

Gong Xi Fa Cai :D