itextpdf简单使用 制作豆瓣日志pdf

关于怎么获取豆瓣日志的文章 原来有写过一篇:http://fair-jm.iteye.com/blog/1896575

这个是用htmlparser的 现在的改成jsoup 原理差不多 都是根据tag 还有id来获取 日志的标题 发布时间和内容的

 

先来一张效果图吧 生成的还不错(生成的来源依旧是我姐的豆瓣日志:http://www.douban.com/people/maybedekky/notes) 没错这个工具图片的地址是直接转成图片的...不是text文本..略强大

itextpdf简单使用 制作豆瓣日志pdf_第1张图片
 

所以这部分就略过了 需要的可以看上面的日志。

 

itextpdf的下载地址是:

http://itextpdf.com/download.php


itextpdf简单使用 制作豆瓣日志pdf_第2张图片
 为了格式 还需要一个iText XML Worker来直接将html的内容转成pdf(一些css的设置最好全清空了 不然格式会乱七八糟了)

 

这里有个中文支持的问题

看这里:http://blog.csdn.net/kings988/article/details/5393982

不过我自己试了下不用这么麻烦 只要把字体改成支持中文的字体就好了 很简单的一段(因为支持中文的字体也一定支持英文的不是吗?)

com.itextpdf.tool.xml.css.apply下的ChunkCssApplier类中这样修改:(这两个类都是在IText Xml worker的jar下的):


itextpdf简单使用 制作豆瓣日志pdf_第3张图片
 


itextpdf简单使用 制作豆瓣日志pdf_第4张图片
 好这样中文问题就解决啦(你想换什么字体就换好了)

 

生成的主要代码只有一行:

	    XMLWorkerHelper.getInstance().parseXHtml(writer, document,

	        new StringReader("<html><body>"+arti.warpInfo()+"</body></html>"));

 三个参数分别是:

com.itextpdf.tool.xml.XMLWorkerHelper  com.itextpdf.text.Document  java.io.Reader

当然还有其他重载的方式

 

 

example代码如下 这段代码做测试用的 生成的文件也是完好的:

package org.cc.abao.test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import org.cc.abao.vo.Article;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
/**
 * 
 * @author cc fair_jm(http://fair-jm.iteye.com/)
 *
 */
public class TestJsoup {

	public static void main(String[] args) throws MalformedURLException,
			IOException, DocumentException {
		Document doc = Jsoup.parse(new URL(
				"http://www.douban.com/people/maybedekky/notes"), 5000);

		Elements elements = doc.select("a[data-url]");

		List<String> urls = new ArrayList<String>();

		for (Element element : elements) {
			urls.add(element.attr("data-url"));
		}

		System.out.println(urls);
		
		StringBuffer snote=new StringBuffer();

		Article arti=new Article();
		
//		for(String url:urls){
		Document article = Jsoup.parse(new URL(urls.get(0)), 5000);
		Elements notes = article.select("div#link-report");
		Element note = notes.get(0);
		
		arti.setContent(note.html());
		
		arti.setTitle(article.select("title").get(0).text());
	
		arti.setDate(article.select("span[class=pl]").get(0).text());
		
//		snote="<html><body>"+note.html().replaceAll("<div.*>", "")
//				.replaceAll("</div>", "")+"</body></html>";
		
		
//		snote.append(note.html().replaceAll("<div.*>", "").replaceAll("</div>", ""));
//		}
		
		
		com.itextpdf.text.Document document=new com.itextpdf.text.Document();

        String name=TestJsoup.class.getResource("/").getFile().substring(1)+"/results/loremipsum.pdf";
        
        Files.deleteIfExists(Paths.get(name));
        Files.createFile(Paths.get(name));
        
		PdfWriter writer = PdfWriter.getInstance(document,    
		new FileOutputStream(name));
		
		writer.setViewerPreferences(PdfWriter.HideToolbar);


	    document.open();
	    

	    XMLWorkerHelper.getInstance().parseXHtml(writer, document,

	        new StringReader("<html><body>"+arti.warpInfo()+"</body></html>"));
	    
//	    System.out.println(snote);

	    document.close();

	}

}

 代码已经是乱七八糟的了....

还有个Article的vo类:

package org.cc.abao.vo;

public class Article {

	private String title;
	private String date;
	private String content;
	
	private String wrappedInfo;
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
	public  String warpInfo(){
		if(wrappedInfo==null){
		  wrappedInfo="<p><span style=\"font-size: xx-large;\">"+title+"</span></p><p>"+date+"</p><br /><hr /><h2>"+
		  content.replaceAll("<div.*>", "").replaceAll("</div>", "")+"</h2><br /><hr />";
		}
		return wrappedInfo;
	}
}

 

具体的代码就不放了 说下流程:

  1. 从日志的首页获取全部的日志页(从全部的http://www.douban.com/people/maybedekky/notes?start=XX中得到 形式 1到13页的话 也就是 start=0 start=10.....start=120)
  2. 获取日志内容(同时生成Article 放在list中并排序)
  3. 生成日志

这三个分别对应三个工具类:



 具体代码就不发了 不是很难 大家有兴趣自己动手下吧

你可能感兴趣的:(itext)