一、如何将采集的数据转成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中涉及的字体都以某种参数加进去,如果转图片时,需要读取这个字体编码格式再转。但是可以教大家个简单方式,去查看一下到底字体有没有嵌入进去。
用Adobe Reader软件打开pdf文档,点击“文件”,选择“属性”,再选择“字体”,如上图所示。这说明我的文档中是两种不同规格的字体(可能字体一样,但大小不一样)编辑的。前面的图标是带颜色的(此处蓝色)的,就是说明这两种规格字体编辑的文本是可以转图片的,如果一个灰的,一个带颜色的,那么只能转带颜色字体编辑的那部分,如果都是灰的,那压根就转不了,就会遇到类似上面提到的错误。所以最后一个参数很重要,你如果选择的是NOT_EMBEDDED,那就是不嵌入字体的意思,那样就会导致转图片时错误。
如果大家仅仅是业务需要,可以直接把我的程序转过去,修改自己的文件路径就可以了,程序本身没啥,直接使用就行了。