java加密word文檔
1. java程序在已經存在的word文檔中插入圖片並加密保存為pdf格式的文檔
我曾經也嘗試使用純java技術去解析word文檔,並且使用了apache的jacob,POI等項目,但是由於Microsoft Word使用的doc不是標准DOC文件,而是自己加處理過的,所以現在解析微軟的doc都只能靠破解與猜解,據我所知,現在的技術只能從word中提取出來文字,所以使用純java不太可能實現。
如果使用windows平台的話,可以選擇使用微軟的一些word控制項來達到目的.
2. 如何在java中操作word
想用java操作word文件?jacob是個不錯的選擇,也就是java-com橋,你可以在http://sourceforge.net/projects/jacob-project/下載,我下載的版本是1.12,注意版本太低的話可能會報錯。
如果沒有特殊需求,可以直接使用jacob_*.zip中提供的jacob.jar和jacob.dll。把jacob.dll文件放在系統可以找得到的
路徑上,一般放c:/windows/system32下就行了,注意你用的jacob.dll文件和你的jacob.jar包要匹配,否則會報錯哦!
如果想自己編譯也很簡單,把jacob_*_src.zip解開,建個工程,在build.xml中稍作配置即可:
<property name="JDK" value="D:\Java\j2sdk1.4.2_13"/>
<property name="MSDEVDIR" value="D:\Microsoft Visual Studio\VC98"/>
<property name="version" value="1.12"/>
看出來了嗎,你的機器上需要有JDK和VC環境,VC是用來生成jacob.dll文件的,如果編譯時說找不到MSPDB60.DLL,那就在你的
Microsoft Visual Studio目錄下搜索一下,拷貝到D:\Microsoft Visual
Studio\VC98\Bin下就行了。
如果需要對jacob里的jar包改名,(雖然通常不會發生這種情況,但如果你需要兩個版本的jacob同時使用,改名可能是一種選擇),這時你的工作就多一些:
(1)package改名是必須的了,比如我們把src下的com.jacob.activeX改為com.test.jacob.activeX,把
com.jacob.com改為com.test.jacob.com,打包時只有這兩個包是有用的,所以只改它們就夠了。
(2)然後修改build.xml中src.java.jacob.mainpackage的value為com.test.jacob,修改java.class.main的value為com.test.jacob.com.Jacob。
(3)別忘了javaJarBin中打包的源碼路徑也要改,<include name="com/**/*.class" />改為<include name="com/test/**/*.class" />。
(4)build.xml中對生成的dll和jar包也要改個名,比如我們把這兩個文件改為jacob_test.dll和
jacob_test.jar。修改build.xml中的enerated.filename.dll和generated.filename.jar
的value為你新改的名字。
(5)com.test.jacob.com.LibraryLoader中,System.loadLibrary("jacob");改成
System.loadLibrary("jacob_test");
(6)另外,很重要的,在jni中*.cpp和*.h中com_jacob_com統一改為com_test_jacob_com,com/jacob
/com統一改為com/test/jacob/com。
(7)ant編譯,編譯好的文件在release目錄下。
(8)最後把編譯好的jacob_test.dll文件放在windows/system32下就大功告成了。
現在該用到jacob.jar了,如果你自己修改過jar包的名字,用新改的jar包,如jacob_test.jar,這里統一稱為jacob.jar。
首先在classpath中引入jacob.jar包,如果是web應用,WEB-INF的lib中也要加入jacob.jar包。
下面給一個例子:
類ReplaceWord.java
import com.jacob.com.*;
import com.jacob.activeX.*;
public class ReplaceWord {
public static void main(String[] args) {
ActiveXComponent app = new ActiveXComponent("Word.Application"); //啟動word
String inFile = "C:\\test.doc"; //要替換的word文件
try {
app.setProperty("Visible", new Variant(false)); //設置word不可見
Dispatch docs = app.getProperty("Documents").toDispatch();
Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new
Object[] { inFile, new Variant(false),new Variant(false) }, new
int[1]).toDispatch();
//打開word文件,注意這里第三個參數要設為false,這個參數表示是否以只讀方式打開,因為我們要保存原文件,所以以可寫方式打開。
Dispatch
selection=app.getProperty("Selection").toDispatch();//獲得對Selection組件
Dispatch.call(selection, "HomeKey", new Variant(6));//移到開頭
Dispatch find = Dispatch.call(selection, "Find").toDispatch();//獲得Find組件
Dispatch.put(find, "Text", "name"); //查找字元串"name"
Dispatch.call(find, "Execute"); //執行查詢
Dispatch.put(selection, "Text", "張三"); //替換為"張三"
Dispatch.call(doc, "Save"); //保存
Dispatch.call(doc, "Close", new Variant(false));
} catch (Exception e) {
e.printStackTrace();
} finally {
app.invoke("Quit", new Variant[] {});
app.safeRelease();
}
}
}
也許你會問,我怎麼知道要調用哪個方法傳哪些參數來進行操作?別忘了,word還有宏呢!自己錄制一個宏,編輯這個宏就可以看到代碼了!用哪個對象的哪個方法就看你的了。
我總結了一下:
document下的組件都用Dispatch selection=app.getProperty("Selection").toDispatch()這種方法獲得;
再往下的組件就需要調用selection的方法來獲取,如 Dispatch find = Dispatch.call(selection, "Find").toDispatch();
如果某個方法需要參數,Dispatch doc =
Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { inFile, new
Variant(false),new Variant(false) }, new
int[1]).toDispatch()是一個例子,這是調用docs的Open方法,Object[]數組里就是它需要的參數了;
如果要修改某個組件的屬性呢,用Dispatch.put(find, "Text", "name")這種形式,"Text"是屬性名,"name"是值。
3. java:解析word文檔(前程無憂簡歷),最好有代碼案例poi或者jacob解析都可以,有jar資源,求急。感謝
poi讀取前程無憂的簡歷會打不開的,至少我以前讀是這樣的,因為他有時候是mht文件直接另存為word文檔的,所以保險起見建議用jacob來讀,如果他是doc或者是docx文檔可以轉化為html然後用jsoup來讀取,效果挺好的
下面是轉化的代碼:
packagecom.java.doc;
importcom.jacob.activeX.ActiveXComponent;
importcom.jacob.com.Dispatch;
importcom.jacob.com.Variant;
publicclassJacobRead{
publicstaticvoidextractDoc(StringinputFIle,StringoutputFile){
booleanflag=false;
//打開Word應用程序
ActiveXComponentapp=newActiveXComponent("Word.Application");
try{
//設置word不可見
app.setProperty("Visible",newVariant(false));
//打開word文件
Dispatchdoc1=app.getProperty("Documents").toDispatch();
Dispatchdoc2=Dispatch.invoke(
doc1,
"Open",
Dispatch.Method,
newObject[]{inputFIle,newVariant(false),
newVariant(true)},newint[1]).toDispatch();
//作為txt格式保存到臨時文件
Dispatch.invoke(doc2,"SaveAs",Dispatch.Method,newObject[]{
outputFile,newVariant(7)},newint[1]);
//關閉word
Variantf=newVariant(false);
Dispatch.call(doc2,"Close",f);
flag=true;
}catch(Exceptione){
e.printStackTrace();
}finally{
app.invoke("Quit",newVariant[]{});
}
if(flag==true){
System.out.println("TransformedSuccessfully");
}else{
System.out.println("TransformFailed");
}
}
publicstaticvoidmain(String[]args){
JacobRead.extractDoc("D:/xxxx簡歷.doc","D:/e.txt");
}
}
當然,也可以轉化為txt讀取,這部分代碼沒保存,你可以到網上找找,和轉化成html的方法大差不差。
然後下面是我以前寫的poi讀取的方式:
packageTestHanLp;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importorg.apache.poi.POIXMLDocument;
importorg.apache.poi.POIXMLTextExtractor;
importorg.apache.poi.hwpf.extractor.WordExtractor;
importorg.apache.poi.openxml4j.opc.OPCPackage;
importorg.apache.poi.xwpf.extractor.XWPFWordExtractor;
importorg.apache.poi.xwpf.usermodel.XWPFDocument;
publicclassTest{
privatestaticStringtext="";
publicstaticStringRead(Stringpath)throwsException{
//解析docx格式的簡歷
if(path.toLowerCase().endsWith("docx")){
try{
OPCPackageoPCPackage=POIXMLDocument.openPackage(path);
XWPFDocumentxwpf=newXWPFDocument(oPCPackage);
POIXMLTextExtractorex=newXWPFWordExtractor(xwpf);
text=ex.getText();
oPCPackage.close();
}
catch(FileNotFoundExceptione)
{
e.printStackTrace();
}
catch(IOExceptione)
{
e.printStackTrace();
}
}else{
//解析doc格式的簡歷
if(path.toLowerCase().endsWith("doc")){
FileInputStreamfis=newFileInputStream(path);//載入文檔
WordExtractorwordExtractor=newWordExtractor(fis);
String[]paragraph=wordExtractor.getParagraphText();
StringBufferstringBuffer=newStringBuffer();
for(inti=0;i<paragraph.length;i++){
if(null!=paragraph[i]&&!"".equals(paragraph[i])){
paragraph[i]=paragraph[i].substring(0,paragraph[i].length()-1);//去掉末尾符號
}
stringBuffer.append(paragraph[i]).append(" ");//將每一小段隔開
}
text=stringBuffer.toString();
}
}
returntext;
}
}
望題主採納
對了,jacob讀取word文檔的效果比poi號,但運行速度不夠,用的時候自己考慮考慮吧