import org.faceless.pdf2.*;
import java.util.Locale;
import java.awt.Color;
import java.util.*;
import java.io.*;
/**
* 创建一个PDF文档,内容来源于一个TXT文本文件。
* 相关包下载 http://big.faceless.org/products/bfopdf-2.11.4.zip
* author:小段
*/
public class CreateBook {
private static PDFStyle numstyle;
private static int pagenum = 1;
private static PDF pdf;
private static final String PAGESIZE
= "A4-Landscape";
private static final float WIDTH, HEIGHT;
static {
PDFPage page = new PDFPage(PAGESIZE);
WIDTH = (page.getWidth() / 2) - 100;
HEIGHT = page.getHeight() - 100;
}
String filename
= args.
length > 0 ? args
[0] : "C:\\bfo.txt";
// 设置文本源文件,并且创建一个PDF对象。
pdf = new PDF();
pdf.
setLocale(Locale.
ENGLISH);
// 创建一个新的PDF格式,设置字体(罗马字体)、字号(11)以及颜色(黑色)。
PDFStyle textstyle = new PDFStyle();
textstyle.setFont(new StandardFont(StandardFont.TIMES), 11);
textstyle.
setFillColor(Color.
black);
textstyle.setTextAlign(PDFStyle.TEXTALIGN_JUSTIFY);
numstyle = new PDFStyle();
numstyle.setFont(new StandardFont(StandardFont.TIMES), 8);
numstyle.
setFillColor(Color.
black);
numstyle.setTextAlign(PDFStyle.TEXTALIGN_CENTER);
LayoutBox chapter = new LayoutBox(WIDTH);
int chapternumber = 0;
long starttime
= System.
currentTimeMillis();
// 文件开始被读取.
while ((line=in.readLine())!=null) {
line = line.trim();
if (line.length()==0) {
line = "\n\n";
} else {
line += " ";
}
// 调用requote方法。
line = textstyle.getFont().requote(line, pdf.getLocale());
// 开始将内容写进PDF文档。
if (line.startsWith("Chapter ")) {
if (chapternumber>0) {
System.
out.
println(new Date()+": Writing Chapter "+chapternumber
);
writeChapter(chapter, chapternumber);
}
chapternumber++;
chapter = new LayoutBox(WIDTH);
}
chapter.addText(line, textstyle, pdf.getLocale());
}
// 将最后一个段落写入PDF文档
System.
out.
println(new Date()+": Writing Chapter "+chapternumber
);
writeChapter(chapter, chapternumber);
System.
out.
println(new Date()+": Compressing and writing to file");
pdf.render(out);
out.close();
// 显示操作PDF文档的总共时间。
System.
out.
println("Total time was "+(System.
currentTimeMillis()-starttime
)+"ms");
}
private static void writeChapter(LayoutBox chapter, int chapternumber) {
PDFPage page=null;
boolean firstpage = true;
float left;
// 测量文本高度以前,必须清空缓存。
chapter.flush();
while (chapter!=null) {
// 清空布局格式。
LayoutBox next=null;
if (chapter.getHeight() > HEIGHT) {
next = chapter.splitAt(HEIGHT);
}
if (pagenum%2 == 1) {
page = pdf.newPage(PAGESIZE);
left = 50;
// 写下页数。
page.setStyle(numstyle);
page.drawText("Page "+ pagenum, page.getWidth()/4, 30);
page.drawText("Page "+ (pagenum+1), 3*page.getWidth()/4, 30);
} else {
left = (page.getWidth()/2)+50;
}
page.drawLayoutBox(chapter, left, page.getHeight()-50);
chapter = next;
pagenum++;
// 如果是第一页的话,添加一个书签。
if (firstpage) {
pdf.getBookmarks().add(new PDFBookmark("Chapter "+chapternumber, PDFAction.goTo(page)));
firstpage = false;
}
}
// 确定下一个段落应该写在剩下的页面。
pagenum |= 1;
}}