最近用java重写了整个网站,耗费了大量的人力物力财力,终于初具规模了,写一些建站心得,也算是技术总结了。技术本身很简单,嘿嘿,别见笑了:)由于采用了java的系统,众多的开源软件为我的网站构建提供了良好的创意支持,礼拜天的时候突发奇想,想给我的博客添上自动的pdf输出和word输出,立马就实践了。

    要产生PDF,需要开源的生成组件,我选择了非常成熟的iText系统,他是广泛采用的结构化文本输出工具。在编程的初期我遇到了些困难,如何将HTML转换成PDF成了凶猛的拦路虎,我的博客文本是由OBLOG输出的,所以也没有什么标准的规范实现,无法实现自动转换。查阅了相关的资料,开始使用Jtidy先规范HTML->XHTML,再尝试XHTML->XML,XML->FO,FO->PDF。流水线上虽然顺理成章但战线实在是太长,对于我这样的懒人,这样的规范操作被立即否定了。

    后来我尝试自己解析HTML,我的唯一目的只是将博客转换为PDF,对博客中的图片、表格之类的不是太关心,那么只需要将HTML标签去掉,合理分段就好。在之后的尝试过程中异常顺利,我将结束标签(等)转化为换行,然后直接去掉了所有的HTML标签,保留了纯文本的博客正文。转换的结果令我非常满意,iText的便捷也让我尝足了开源软件的好处,现在你可以尝试着点击左边的下载为PDF文档来看看我的杰作吧:)

    // 取出纯文本,并保留换行
    public String[] getTextParagraphs(String s) {
        s = Pattern.compile("<
\\/div>", Pattern.CASE_INSENSITIVE).matcher(s)
                .replaceAll(SPILIT_WORDS);
        s = Pattern.compile("<
\\/p>", Pattern.CASE_INSENSITIVE).matcher(s)
                .replaceAll(SPILIT_WORDS);
        s = Pattern.compile("", Pattern.CASE_INSENSITIVE).matcher(s)
                .replaceAll(SPILIT_WORDS);
        s = Pattern.compile(" ", Pattern.CASE_INSENSITIVE).matcher(s)
                .replaceAll(SPILIT_WORDS);
        s = s.replaceAll("]+>", ""); // 剔出了的标签
        String ss[] = s.split(SPILIT_WORDS);
        return ss;
    }
    // 写pdf文件,有删除
    public void doPreparePdf(File f, Log log) {
        try {
            String[] paragraphs = getTextParagraphs(log.getLogtext());
 
            Document doc = new Document();
            PdfWriter.getInstance(doc, new FileOutputStream(f));
 
            BaseFont songti = BaseFont.createFont("STSong-Light",
                    "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            doc.add(new Paragraph(log.getTopic(), fontTitle));  // 博客标题
            doc.add(Chunk.NEWLINE);
            for (String paragraph : paragraphs) {  // 正文
                paragraph = paragraph.trim();
                if (paragraph.equals("")) {
                    continue;
                }
                paragraph = "  " + paragraph;
                Paragraph p = new Paragraph(paragraph, fontNormal);
                p.setSpacingBefore(10f);
                doc.add(p);
                p.add(Chunk.NEWLINE);
            }
            doc.add(Chunk.NEXTPAGE);
            doc.add(new Paragraph("文章信息", fontTitle));  // 结尾信息
            doc.close();
            System.out.println("[PDF] " + log.getTopic() + " Created.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

(完)