Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
414 views
in Technique[技术] by (71.8m points)

itextpdf - How to choose the optimal size for a font?

I'm creating a pdf document with a grid table based on the PdfPTable in itextpdf. The input data arrives as a java String[][] with all the cells filled. For each column, I iterate over all the rows to identify the maximum columns required to display the data for that column. That becomes the column width. All of the column widths are summed to determine the maximum number of columns for the entire table. At this point, my intent is to calculate the optimum point size for a monospace font to fully occupy the width of the columns. The objective is maximum readability in the face of very dynamic input data. For wide columns, I'm ending up with lots of trailing whitespace instead of filling the column nicely from left to right. A left justified appearance inside the column is desirable. The runtime environment is openjdk-1.6.0 on RHEL5.X. Any fonts in use must be resident on the system as it has no outside connectivity.

The code is fully up and running, but the appearance could be better if the column text fully occupied the column fieids.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I've read your question three times, and I don't understand it.

Let me try to rephrase it: Given a certain available width, how do I define the font size for a snippet of text, so that it matches the available width.

First you need a BaseFont object. For instance:

BaseFont bf = BaseFont.createFont(BaseFont.COURIER, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);

Now you can ask the base font for the width of this String in 'normalized 1000 units' (these are units used in 'Glyph space'; see ISO-32000-1 for more info):

float glyphWidth = bf.getWidth("WHAT IS THE WIDTH OF THIS STRING?");

Now we can convert these 'normalized 1000 units' to an actual size in points (actually user units, but let's assume that 1 user unit = 1 pt for the sake of simplicity).

For instance: the width of the text "WHAT IS THE WIDTH OF THIS STRING?" when using Courier with size 16pt is:

 float width = glyphWidth * 0.001f * 16f;

Your question is different: you want to know the font size for a given width. That's done like this:

 float fontSize = 1000 * width / glyphwidth;

I hope this answers your question. If not, please rephrase.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...