I am having difficulty reading UTF-8 encoded text (Sanskrit) from a text file
and writing it onto a PDF page. No text is printed at all when I read from the
file. However, when I simply generate text in the program, it prints as I would
expect. The non-text portions of the page (the lines for the flashcards) print
fine. Also, I am able to do a round trip of reading from the file and writing
to another (text) file in UTF-8 such that I can read it as I expect; I
commented that part out.
I wonder if I am using the correct the correct Font invocations on in my
drawText() method. There seem to be a number of ways to get a font
(FontFactory, Font, BaseFont..) and I am not compeletely positive that i am
doing it the correct way. Any help is appreciated.
import java.io.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
public class BusCard {
float LTMARG= 0.5f*72;
float BOTMARG= 0.25f*72;
float CARDWIDTH= 3.5f*72;
float CARDHT= 2*72f;
float PAD=15;
float [][] VRT_2BY5_BCARDS = new float[][]{
{LTMARG+PAD, BOTMARG+(5*CARDHT)-PAD, CARDWIDTH-PAD/2,
CARDHT-PAD/2},
{LTMARG+2*CARDWIDTH+PAD, BOTMARG+(5*CARDHT)-PAD,
CARDWIDTH-PAD/2, CARDHT-PAD/2},
{LTMARG+PAD, BOTMARG+(4*CARDHT)-PAD, CARDWIDTH-PAD/2,
CARDHT-PAD/2},
{LTMARG+2*CARDWIDTH+PAD, BOTMARG+(4*CARDHT)-PAD,
CARDWIDTH-PAD/2, CARDHT-PAD/2},
{LTMARG+PAD, BOTMARG+(3*CARDHT)-PAD, CARDWIDTH-PAD/2,
CARDHT-PAD/2},
{LTMARG+2*CARDWIDTH+PAD, BOTMARG+(3*CARDHT)-PAD,
CARDWIDTH-PAD/2, CARDHT-PAD/2},
{LTMARG+PAD, BOTMARG+(2*CARDHT)-PAD, CARDWIDTH-PAD/2,
CARDHT-PAD/2},
{LTMARG+2*CARDWIDTH+PAD, BOTMARG+(2*CARDHT)-PAD,
CARDWIDTH-PAD/2, CARDHT-PAD/2},
{LTMARG+PAD, BOTMARG-PAD, CARDWIDTH-PAD/2,
CARDHT-PAD/2},
{LTMARG+2*CARDWIDTH+PAD, BOTMARG-PAD, CARDWIDTH-PAD/2,
CARDHT-PAD/2},
};
public static final String RESULT =
"C:/all/_sanskrit/flashcards/buscards.pdf";
protected static final String
cardfile="C:/all/_sanskrit/flashcards/SEL-first10.txt";
List <String>front;
List <String>back;
Font sans;
public void createPdf(String filename)
throws DocumentException, IOException {
// step 1
Document document = new Document(PageSize.LETTER);
// step 2
PdfWriter writer
= PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
drawCards(writer.getDirectContentUnder());
drawText(writer.getDirectContentUnder());
// step 5
document.close();
}
void readfile()throws IOException{
Scanner scanner = new Scanner(new FileInputStream(cardfile),
"UTF-8");
front = new ArrayList<String>();
back = new ArrayList<String>();
try {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] fields = line.split("\\t");
front.add(fields[0]);
if (fields.length>1){back.add(fields[1]);}
}
} finally {
scanner.close();
}
}
protected void drawCards(PdfContentByte pcb)
throws DocumentException {
int i;
pcb.saveState();
for (i=0;i<=4; i++){
pcb.rectangle(LTMARG , BOTMARG + i*CARDHT, CARDWIDTH,
CARDHT);
pcb.stroke();
}
for (i=0;i<=4; i++){
pcb.rectangle(LTMARG + CARDWIDTH, BOTMARG + i*CARDHT,
CARDWIDTH, CARDHT);
pcb.stroke();
}
pcb.restoreState();
}
protected void drawText(PdfContentByte pcb)
throws IOException, DocumentException {
FontFactory.register("c:/windows/fonts/sanskrit2003.ttf",
"sanskrit");
sans = FontFactory.getFont("sanskrit", "UTF-8", true);
readfile();
pcb.saveState();
for (int i=0;i<10;i++){
ColumnText ct = new ColumnText(pcb);
//Phrase myText = new Phrase(front.get(i));
Phrase myText = new Phrase(i+ " read this");
myText.setFont(sans);
//out.write(front.get(i));
ct.setSimpleColumn(myText,
VRT_2BY5_BCARDS[i][0],
VRT_2BY5_BCARDS[i][1],
VRT_2BY5_BCARDS[i][2],
VRT_2BY5_BCARDS[i][3],
16,
Element.ALIGN_CENTER);
ct.go();
}
pcb.restoreState();
}
public static void main(String[] args) throws DocumentException,
IOException {
new BusCard().createPdf(RESULT);
System.out.println("done");
}
}
------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software
be a part of the solution? Download the Intel(R) Manageability Checker
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions
iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples:
http://itextpdf.com/themes/keywords.php