Feb 24

We generally use the excellent iText library for generating pdf files using Java.

When we need to display text vertically it is simply a matter of rotating the cell containing the text by 90 degrees as shown in the following example.

PdfPCell cell = new PdfPCell(new Phrase("Some text I want to be vertical"));
cell.setRotation(90);

The same technique can be used to render text at any angle.

written by objects \\ tags: , , , ,

Feb 22

Unicode string can contain lots lots of characters we don’t always want to deal with.

If you know specifically what characters you want to get rid of then you can use replaceAll() to get rid of them. But for a more general solution Java provides the java.text.Normalizer class.

The Normalizer class transforms Unicode text into an equivalent composed or decomposed form. Here is an example of its usage:

// Use Canonical decomposition
String normalized = Normalizer.normalize(unicodeString, 
   Normalizer.Form.NFD);

written by objects \\ tags: , , , ,

Feb 22

We’ve all got code riddled with System.out.println() messages. We should use a logging framework, but often we’re in a rush and we end up writing to stdout because its simpler at the time.

If there are too many System.out.println() calls and we want to stop them going to the console then we can redirect stdout and stderr to a different stream using the setOut() and setErr() methods provided by the System class.

If we want to instead have them written to a Swing text component such as a JTextArea or JTextPane then what we need is an OutputStream subclass that will write to the text component.

The following code shows how that can achieved, resulting in System.out.println() call writing to your designated JTextComponent.

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;

public class RedirectOutput {

	private JTextComponent textComponent;
	
	public static void sendTo(JTextComponent textComponent) {
		new RedirectOutput(textComponent).redirectSystemStreams();
	}
	
	private RedirectOutput(JTextComponent textComponent) {
		this.textComponent = textComponent;
	}
	
	private void updateTextComponent(final String text) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Document doc = textComponent.getDocument();
				try {
					doc.insertString(doc.getLength(), text, null);
				} catch (BadLocationException e) {
					throw new RuntimeException(e);
				}
				textComponent.setCaretPosition(doc.getLength() - 1);
			}
		});
	}

	private void redirectSystemStreams() {
		OutputStream out = new OutputStream() {
			@Override
			public void write(final int b) throws IOException {
				updateTextComponent(String.valueOf((char) b));
			}

			@Override
			public void write(byte[] b, int off, int len) throws IOException {
				updateTextComponent(new String(b, off, len));
			}

			@Override
			public void write(byte[] b) throws IOException {
				write(b, 0, b.length);
			}
		};

		System.setOut(new PrintStream(out, true));
		System.setErr(new PrintStream(out, true));
	}

}

written by objects \\ tags: , , , , , , ,