目 录
摘 要 I
Abstract II
第1章 绪 论 1
1.1 课题研究背景和意义 1
1.2 国内外研究现状 1
1.2.1 国内研究现状 1
1.2.2 国外研究现状 2
1.3 论文研究内容 3
1.4 本文结构 3
第2章 相关技术 4
2.1 JSP技术简介 4
2.2 SQL Server数据库技术简介 5
2.3 JDBC 技术简介 6
2.4 B/S模式分析 7
2.5 JCOM 相关技术 9
2.6 POI 相关技术 10
2.7 PDFbox 相关技术 10
2.8 SWFTools 相关技术 11
2.9 JavaScript相关技术 11
第3章 需求分析 12
3.1 系统需求总述 12
3.2 功能性需求分析 12
3.2.1 用户管理 12
3.2.2 文献管理 14
3.2.3文献浏览 14
3.3 非功能需求分析 15
3.3.1 硬件环境 15
3.3.2 软件环境 16
3.3.3 界面需求 16
3.3.4 响应时间需求 17
3.3.5 经济可行性 17
3.3.6 操作可行性 17
3.3.7 法律可行性 17
3.3.8 系统安全性需求 17
3.4 本章小结 18
第4章 系统设计 19
4.1 概要设计 19
4.1.1 体系结构的设计 19
4.1.2 系统层次结构 19
4.2 详细设计 21
4.2.1 系统功能模块图 21
4.2.2 用户管理 21
4.2.3 文献管理 23
4.2.4 文献浏览 25
4.2.5 数据存储设计 27
4.3 本章小结 29
第5章 系统实现 30
5.1 模块功能的具体实现 30
5.1.1 用户管理模块 30
5.1.2 文献管理模块 31
5.1.3 文献浏览模块 33
5.2 主要技术难题及解决方案 36
5.2.1 在线浏览问题 36
5.2.2 word文件与PDF文件内容的检索 38
5.2.3 下载文件文件名中文显示问题 39
5.3 本章小结 40
第6章 系统测试 41
6.1 功能性测试 41
6.1.1 系统登录模块 41
6.1.2 用户管理模块 41
6.1.3 文献管理模块 42
6.1.4 文献浏览模块 43
6.2 非功能测试 44
6.2.1 GUI测试 44
6.2.2 性能测试 44
6.2.3 安全性测试 44
第7章 总结与展望 45
7.1 结论 45
7.2 展望 45
参考文献 46
致谢 47
第3章 需求分析
3.1 系统需求总述
典型的文档、文献管理系统应满足如下的基本需求:
能够处理大量的复合文档型的数据信息,一般认为,关系数据库对于非结构化数据的表示和存储存在一定的困难,而文献管理系统中的信息载体大多是以不可修改的文档形式出现,因此文献管理系统必须解决利用关系数据库存储复合文档信息的问题。
系统主要针对需要经常阅读大量文献的人员,如科研人员,企业的技术人员、学者等,他们所涉及的领域通常要分类很细,所以需要阅读的文献数量是大量的,由于数量的问题,使得文献的分类就成为一个大问题,这就需要文献综合起来管理
支持移动办公在日常的工作中,因为我们要在不同的地方进行文献的查看,而且随着网络技术的发展,学术研究打破了时间、地域的限制,使人们能够随时随地参与到学术研究、企业办公过程中来,大大提高工作的效率和方便性。
保证文档机密能够使得工作和存储的文档更加的安全,避免企业因为文档的丢失、内容的泄漏等安全原因造成不可避免的经济损失。
文献检索功能对存储的文档进行多条件的模糊检索,包括标题检索,关键词检索,全文检索,所有者检索,时间检索等多种检索手段。
3.2 功能性需求分析
3.2.1 用户管理
用户管理所完成的功能为:对文档管理系统的用户进行管理。
用户包括了三种用户类别。即系统管理员(三级用户)、文献管理员(二级用户)和普通用户(一级用户)。
系统管理员是属于系统自带用户的,拥有最高权限。可以进行系统的各类权限分配和数据维护,主要给每一个普通用户统一分配相应的系统使用权限,并实时维护系统数据,但对于文档数据也可以操作,但不是其主要职责。
文献管理员是专门对文献进行管理的角色,它是一种部门级别的角色,每个部门都拥有这样一个角色,来管理部门的文献,它是由系统管理员分配的。
普通用户是由系统管理员分配的,普通用户具有权限范围内的信息浏览和检索的权限。
系统初始化时只有系统管理员,通过系统管理员来建立其他用户。系统管理员可以建立低于自己用户类别的用户。新建用户时输入用户的相关的属性信息,选择用户的类别,分配用户的角色,可以保存、删除、修改、注册新建的用户。
对于已经注册的用户,系统管理员可以修改低于自己用户类别的用户信息,可以删除,禁止低于自己用户类别的用户,恢复已禁用同类别的用户。当前用户可以更改自己的相关的用户信息。
用户类别的高低为:系统管理员(三级用户)>文献管理员(二级用户)>普通用户(一级用户)。系统管理员的类别是最高,它可以对普通用户进行管理,普通用户只能对自己进行管理。用户同时只能属于一种用户类别。一个用户不能同时是文献管理员,系统管理员,普通用户中的两个。
对于用户管理的需求分析,得到图3.1的用户管理用例图。
图3.1系统管理员用例
3.2.2 文献管理
文献管理所完成的功能为:文献管理员对文献信息的管理。
主要包括:文献分类的管理和文献信息的管理。文献分类的管理包括添加文献分类,修改文献分类和删除文献分类等基本功能。文献信息管理则包括上传新文献并填写其题目、分类详细信息,修改已上传的文献详细信息,删除已上传的文献信息和其已上传的文件等功能。
对于文献管理的需求分析,得到图3.2的文献管理用例图。
图3.2文献管理员用例
4.2 详细设计
4.2.1 系统功能模块图
本系统的系统功能模块如图4.3所示。分为用户管理、文献管理和文献浏览三个大模块。每个模块下有若干子模块。本文转载自http://www.biyezuopin.vip/onews.asp?id=13102系统以各个模块为单位进行设计。
图4.3 系统的功能模块
4.2.2 用户管理
用户管理主要完成用户的增加,修改,删除等操作。在Web层中,给出了新建用户信息,修改用户信息,用户列表等界面显示实现代码。在业务逻辑中,定义了用户类的各种方法,在数据访问层,定义了和数据库进行用户信息存取的各种方法。这里,给出增加新用户的序列图,如图4.4所示。
package com.util;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;import jp.ne.so_net.ga2.no_ji.jcom.IDispatch;
import jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager;/*** doc docx格式转换* * @author Administrator* */
public class DocConverter {private static final int environment = 1;// 环境 1:windows 2:linux// (只涉及pdf2swf路径问题)private String fileString;private String outputPath = "\\pic";// 输入路径 ,如果不设置就输出在默认的位置private String fileName;private String type;private File pdfFile;private File swfFile;private File docFile;private File textFile;private File file;final static int BUFFER_SIZE = 1024*1024;
//SWFTools的环境安装路径 public static String SWFTOOLS_PATH="F:"+File.separator+"毕设"+File.separator+"SWFTools"+File.separator; //播放器样式文件rfxview.swf的路径 public static String RFXVIEW_SWF_PATH="F:"+File.separator+"毕设"+File.separator+"SWFTools"+File.separator+"rfxview.swf";public DocConverter(String fileString) {ini(fileString);}/*** 重新设置file* * @param fileString*/public void setFile(String fileString) {ini(fileString);}/*** 初始化* * @param fileString*/private void ini(String fileString) {this.fileString = fileString;file = new File(fileString);type = fileString.substring(fileString.lastIndexOf(".")+1,fileString.length());type = type.toLowerCase();fileName = fileString.substring(0, fileString.lastIndexOf("."));if(type.equals("doc")||type.equals("docx")||type.equals("txt")){docFile = new File(fileString);}//if(type == "text")// textFile = new File(fileString);pdfFile = new File(fileName + ".pdf");swfFile = new File(fileName + ".swf");}/*** 转为PDF* * @param file*/private void doc2pdf() throws Exception {ReleaseManager rm = null; IDispatch app = null; try { rm=new ReleaseManager(); app = new IDispatch(rm, "PDFMakerAPI.PDFMakerApp"); app.method("CreatePDF",new Object[]{docFile.getPath(),pdfFile.getPath()});} catch (Exception e) { throw e; } finally { try { app=null; rm.release(); rm = null; } catch (Exception e) { throw e; } } }/*** 转换成 swf*/private void pdf2swf() throws Exception {Runtime r = Runtime.getRuntime();if (!swfFile.exists()) {if (pdfFile.exists()) {if (environment == 1) {// windows环境处理try {
// Process p = r.exec("F:\\毕设\\SWFTools\\pdf2swf.exe "
// + pdfFile.getPath() + " -o "
// + swfFile.getPath());String[] envp = new String[1]; envp[0] = "PATH="+SWFTOOLS_PATH; String command = "cmd /c \""+SWFTOOLS_PATH+"pdf2swf\" -z -s flashversion=9 " + pdfFile.getPath() + " -o " + swfFile.getPath() ; Process p = Runtime.getRuntime().exec(command, envp); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(p.getInputStream())); while (bufferedReader.readLine() != null) { } try { p.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } command = "cmd /c \""+SWFTOOLS_PATH+"swfcombine\" "+RFXVIEW_SWF_PATH+" viewport=" + swfFile.getPath() + " -o " + swfFile.getPath(); p = Runtime.getRuntime().exec(command, envp);bufferedReader = new BufferedReader( new InputStreamReader(p.getInputStream())); while (bufferedReader.readLine() != null) { } try { p.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print(loadStream(p.getInputStream()));System.err.print(loadStream(p.getErrorStream()));System.out.print(loadStream(p.getInputStream()));if(swfFile.exists())System.err.println("****swf转换成功,文件输出:"+ swfFile.getPath() + "****");elseSystem.err.println("****swf转换失败****");if (pdfFile.exists()&&(type.equals("doc")||type.equals("docx")||type.equals("txt"))) {pdfFile.delete();}} catch (IOException e) {e.printStackTrace();throw e;}} else if (environment == 2) {// linux环境处理try {Process p = r.exec("pdf2swf " + pdfFile.getPath()+ " -o " + swfFile.getPath() + " -T 9");System.out.print(loadStream(p.getInputStream()));System.err.print(loadStream(p.getErrorStream()));if(swfFile.exists())System.err.println("****swf转换成功,文件输出:"+ swfFile.getPath() + "****");elseSystem.err.println("****swf转换失败****");if (pdfFile.exists()&&(type.equals("doc")||type.equals("docx")||type.equals("txt"))) {pdfFile.delete();}} catch (Exception e) {e.printStackTrace();throw e;}}} else {System.out.println("****pdf不存在,无法转换****");}} else {System.out.println("****swf已经存在不需要转换****");}}static String loadStream(InputStream in) throws IOException {int ptr = 0;in = new BufferedInputStream(in);StringBuffer buffer = new StringBuffer();while ((ptr = in.read()) != -1) {buffer.append((char) ptr);}return buffer.toString();}/*** 转换主方法*/public boolean conver() {/*if (swfFile.exists()) {System.out.println("****swf转换器开始工作,该文件已经转换为swf****");return true;}*/if (environment == 1) {System.out.println("****swf转换器开始工作,当前设置运行环境windows****");} else {System.out.println("****swf转换器开始工作,当前设置运行环境linux****");}if (swfFile.exists()) {System.out.println("****swf已经存在不需要转换****");return true;}try {if(type.equals("doc")||type.equals("docx")||type.equals("txt"))doc2pdf();pdf2swf();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return false;}if (swfFile.exists()) {return true;} else {return false;}}/*** 返回文件路径* * @param s*/public String getswfPath() {if (swfFile.exists()) {String tempString = swfFile.getPath();tempString = tempString.replaceAll("\\\\", "/");return tempString;} else {return "";}}public String fileToString() throws Exception{ FileInputStream in=new FileInputStream(file);if(getFileType().equals("doc")){WordExtractor extractor = new WordExtractor(in); String text2003 = extractor.getText(); text2003 = text2003.replace(" ", "");return text2003;}else if(getFileType().equals("docx")){OPCPackage opcPackage = POIXMLDocument.openPackage(fileString); POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage); String text2007 = extractor.getText(); text2007 = text2007.replace(" ", "");return text2007;}else if(getFileType().equals("pdf")){PDDocument doc=PDDocument.load(fileString); PDFTextStripper stripper=new PDFTextStripper(); String textPdf = stripper.getText(doc);textPdf = textPdf.replace(" ", "");doc.close();return textPdf;}else{ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] data = new byte[BUFFER_SIZE]; int count = -1; while((count = in.read(data,0,BUFFER_SIZE)) != -1) outStream.write(data, 0, count); data = null; String text =new String(outStream.toByteArray(),"GB2312");outStream.close();return text; }}
// public String InputStreamToString(InputStream is) throws IOException {
// if (is != null) {
// StringBuilder sb = new StringBuilder();
// String line;
//
// try {
// BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
// while ((line = reader.readLine()) != null) {
// sb.append(line).append("\n");
// }
// } finally {
// is.close();
// }
// return sb.toString();
// } else {
// return "";
// }
// }
public boolean findText(String text) throws Exception{try {String fText =fileToString();for(int t=0;t<fText.length()-text.length();t++){if(fText.regionMatches(true,t,text,0,text.length())==true)return true;}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} return false;}public String getRealName() {String realName = fileName.substring(fileName.lastIndexOf("\\")+1,fileName.lastIndexOf("\\")+13);return realName;}public String getFileType() {return type;}/*** 设置输出路径*/public void setOutputPath(String outputPath) {this.outputPath = outputPath;if (!outputPath.equals("")) {char t = outputPath.charAt(outputPath.length()-1);if (outputPath.charAt(outputPath.length()-1) == '\\') {swfFile = new File(outputPath + getRealName().substring(0, 12) + ".swf");} else {swfFile = new File(outputPath +"\\"+ getRealName().substring(0, 12) + ".swf");}}}
}