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; } public static void main(String args[]) throws IOException { 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; BufferedReader in = new BufferedReader(new FileReader(filename)); String line; long starttime = System.currentTimeMillis(); System.out.println(new Date()+": Starting file"); // 文件开始被读取. 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"); OutputStream out = new FileOutputStream("C:\\BFO.pdf"); 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; }}