记事本转pdf(加水印)、转图片 一

一、如何将采集的数据转成pdf

    关于爬虫采集数据部分,这里就不详细介绍了,关于爬虫的篇章可以参考我的另一篇博客,采集下来的数据,每个页面用一个记事本保存。

    最初的想法是,用word转pdf应该效果会好一些,所以我第一步是将记事本文件转成word文件,这个转换过程非常简单,只需要批量将记事本扩展名.txt改为.doc即可。

    接下来就是要实现word到pdf的转换,这方面的程序,百度一下,还是很多的,但是关于这一步,我没有转换成功,遇到了错误,百度一下给出的说法是可能2003和2007版本不兼容的问题,而且程序介绍中基本都提到需要在本机安装microsoft office,我平时喜欢用wps,没有安装微软的word,瞬间感觉好麻烦啊(我到这就没有再深入研究下去,如果有大神知道怎么方便转换,请赐教)。其实这种做法确实有些脱裤子放屁。

    所以还不如直接从记事本到pdf转换。这一步本身没有问题,但是在后期pdf转图片的时候,无论是用程序还是用软件转换,死活就是转不过去。遇到unknown CMap:uniGB-UCS2-H错误。关于这个错误,网上很多人都遇到,但没有解决方案。这个系列的博客就是要说明这个问题的。说实话,我虽然解决了这个问题,但我不明白其中的道理,这东西基本都是调用类库,也没必要深入研究下去。下面先把代码粘出来:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;

/**
 * 将从.txt中读到的内容写到pdf中。
 * */
public class txt_pdf {
//	private final static String READFILEPATH = "E:\\null2.txt"; // txt文件
//	private final static String WRITEFILEPATH = "E:\\null2.pdf"; // 生成的pdf文件
	public static String readpath = ""; // txt文件
	public static String outpath = "E:\\zhongyao1\\"; // 生成的pdf文件
	/**
	 * 读取某个文件夹下的所有文件
	 */
	public static boolean readfile(String filepath)
			throws FileNotFoundException, DocumentException,IOException {
		try {

			File file = new File(filepath);
			if (!file.isDirectory()) {
//				System.out.println("absolutepath=" + file.getAbsolutePath());
//				System.out.println("name=" + file.getName());
			} else if (file.isDirectory()) {
				System.out.println("文件夹");
				String[] filelist = file.list();
				for (int i = 0; i < filelist.length; i++) {
					File readfile = new File(filepath + "\\" + filelist[i]);
					if (!readfile.isDirectory()) {
//						System.out.println("path=" + readfile.getPath());
//						System.out.println("absolutepath="
//								+ readfile.getAbsolutePath());
						readpath = readfile.getAbsolutePath();
						outpath = outpath + readfile.getName().replace("txt", "pdf");
						txtpdf(readpath,outpath);
						outpath = "E:\\zhongyao1\\";
//						System.out.println("name=" + readfile.getName());

					} else if (readfile.isDirectory()) {
						readfile(filepath + "\\" + filelist[i]);
					}
				}

			}

		} catch (FileNotFoundException e) {
			System.out.println("readfile()   Exception:" + e.getMessage());
		}
		return true;
	}
	
	public static void txtpdf(String in,String out) throws DocumentException,
	IOException{
		Document document = new Document(PageSize.A4, 80, 80, 60, 30);
		PdfWriter.getInstance(document, new FileOutputStream(out));
		document.open();
//		BaseFont bfChinese = BaseFont.createFont("STSong-Light",
//				"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
		
		BaseFont bfChinese = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,1",
				BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
		Font FontChinese = new Font(bfChinese, 18, Font.NORMAL);
		// Paragraph t = new Paragraph("oracle手册", FontChinese); //标头
		// t.setAlignment(Element.ALIGN_CENTER);
		// t.setLeading(30.0f);
		// document.add(t);
		FontChinese = new Font(bfChinese, 11, Font.NORMAL);
		BufferedReader read = null;
		try {
			read = new BufferedReader(new FileReader(in));
			String line = null;
			Paragraph t = null;
			while ((line = read.readLine()) != null) {
				t = new Paragraph(line, FontChinese);
				t.setAlignment(Element.ALIGN_LEFT);
				t.setLeading(20.0f);
				document.add(t);
			}
		} catch (Exception e) {
			System.out.println("目标文件不存,或者不可读!");
			e.printStackTrace();
		} finally {
			try {
				read.close();
				document.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		System.out.println("============执行成功!===========");
	}
	public static void main(String[] args) throws DocumentException,
			IOException {
		readfile("E://zhongyao");
//		
	}
}



程序中有句:
BaseFont bfChinese = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,1",
				BaseFont.IDENTITY_H,BaseFont.EMBEDDED);

一共三个参数,第一个参数就是采用的字体,第二个参数是横向打印的意思,第三个参数是是否把字体嵌入到pdf文档中。第一个参数采用的是仿宋的好像,后面那个1一定要带上,至于为什么,不清楚。第二个参数没啥好说的,第三个参数才是关键,你如果不把字体嵌入到pdf文档中,你用什么办法也不可能将pdf转成图片格式的。上面说的那个错误其实就是没有把字体嵌入到pdf中导致的,但是那种编码格式是在pdf中才遇到的,它主要是解决了中文编码问题,否则记事本中中文可能转成pdf后就乱码了。但是说实话这个字体不太好用,所以此处我选用的是本地常规的字体库中的字体。

    上面我一直说字体嵌入的问题,关于什么是字体嵌入,我不知道,估计就是将该pdf中涉及的字体都以某种参数加进去,如果转图片时,需要读取这个字体编码格式再转。但是可以教大家个简单方式,去查看一下到底字体有没有嵌入进去。

记事本转pdf(加水印)、转图片 一_第1张图片

    用Adobe Reader软件打开pdf文档,点击“文件”,选择“属性”,再选择“字体”,如上图所示。这说明我的文档中是两种不同规格的字体(可能字体一样,但大小不一样)编辑的。前面的图标是带颜色的(此处蓝色)的,就是说明这两种规格字体编辑的文本是可以转图片的,如果一个灰的,一个带颜色的,那么只能转带颜色字体编辑的那部分,如果都是灰的,那压根就转不了,就会遇到类似上面提到的错误。所以最后一个参数很重要,你如果选择的是NOT_EMBEDDED,那就是不嵌入字体的意思,那样就会导致转图片时错误。

    如果大家仅仅是业务需要,可以直接把我的程序转过去,修改自己的文件路径就可以了,程序本身没啥,直接使用就行了。

你可能感兴趣的:(java,记事本转pdf)