⽤Python在word的指定位置插⼊图⽚(使⽤Python-docx包)1
2
⾸先,本实例是采⽤java语⾔的,需要进⾏xml操作,⾄于poi,docx4j这些,因为感觉不是⽂档不太好,要嘛就是操作不⽅便,⽽且英⽂就算了,主要是注释很少,让⼈云⾥雾⾥的。所以,嘿嘿,直接⽤java写,这些操作包就不⽤了
⾸先,得明⽩docx解压后的⽂件夹是什么,解压后的东西如下
“----------------------------------------------------------------------------”
其中,_rels⽂件夹内容如下:
就⼀个⽂件,⾥⾯的内容如下:
⾥⾯标识了三个xml⽂件的位置,主要是指⽰链接了哪些⽂件。
“------------------------------------------------------------------------------”
docProps⽂件夹⾥⾯的东西如下:
doc是最主要的⽂件夹,⾥⾯是我们的word⽂档内容,挺多东西的
(1)其中这⾥的_rels⽂件夹下有个
这⾥⾯包含了你需要⽤到的下⾯的内容,⽐如说,下⾯的什么l啊等等等⽂件都需要在这⾥引⼊,包括需要⽤到的⽂件,⽐如说⼀个png图⽚。
(2)media⾥⾯放的就是图⽚,等等其它⼀些word⽀持的媒体⽂件。要使⽤这些⽂件,记得在ls⾥引⼊
(3)theme⽂件夹下放的是word⽂档的主题xml⽂件(包含了各种什么字体啊,颜⾊啊,等等⼀堆乱七⼋糟的东西)
(l⾥放的就是我们的word⽂档内容了,如果把docx⽂档⽐喻成⽹页,这⾥⾯放的就是html⽂件了。(等等主要详细介绍)
(5)剩下的⼏个xml⽂件就是注⼊脚注,样式之类的xml⽂件,由于只是介绍盖章,就不介绍了。⼀般docx批处理不会特意单独去改单独某个docx的样式的。
最后,顾名思义,[Content Types]⽂件⾥放的是⽂件内容类型的信息,截图如下,
Extension是扩展类型,如果在word⽂档⾥⽤到了jpeg图⽚,这⾥就要指明使⽤了image/jpeg的内容类型(其它格式模仿上⾯)。这⾥的jpeg可不是指修改了⽂件后缀就好了,是真正的jpeg格式,如果格式和后缀对不上的话(⽂件损坏),word要嘛会把格式转换,要嘛就改后缀成格式后缀了。当然了,正常情况下,格式和后缀不会变的。
好了,现在回头讲讲l这个⽂件。
现在,弄了个word⽂档,内容如下(随便编的内容和章)
上⾯的内容,随便⼏个摘要图随便浏览⼀下就⾏了,下⾯我们分析⼀下。
这个 xml有<w:body>表⽰主体,w:p 表⽰⼀个段落
如:
画线的部分都是⼀个段落,其中,图⽚的左上⾓由于是和申请⼈在同⼀⾏上,所以算是同⼀段落的。
因此,这份l(⽤⾕歌浏览器打开xml,能合并标签)有段落数量如下:
额,感觉还不错,
现在,按顺序点下来,图⽚应该是在第四段落。也就是第四个w:p标签⾥⾯(当然了,凭⾁眼是这么看的,写程序当然不是⽤看的了)。
该段落如下:
这⾥⾯有个w:drawing标签,存放了章图⽚的信息。
我们只需要,把这个dom弄出来。添加到到没盖章的word⽂档⾃⼰需要的段落。注意,rels⾥⼀定要添加对该图⽚的引⽤,且⾥⾯声明的Id 要与上图的rId保持⼀致 ,且⾥⾯的rId是唯⼀的。
上图的rId7在ls⾥已经声明引⽤了
还有,[Content_Types].xml也要声明该图⽚类型。
如果想要移动该图⽚的位置,还是在<w:drawing>包裹的标签⾥⾯,到
⾥⾯的H是⽔平移动,也就是X轴的意思,V是垂直也就是y轴,改变这两个数的数值就改变图⽚的位置了。这⾥是是相对位置(其实也可以弄成绝对于页⾯的位置的),也就是相对于这⼀⼀段开头⾏的位置。包括上padding间隔。假如两个都设置为0,图⽚位置是变成如下:
当然,也可以设置成负数,现在将垂直值设置成-1000000,效果如下:
这样就实现了图⽚指定位置插⼊(图⽚是衬于⽂字下⽅的,浮于上⽅也⾏,不然漂移图⽚不了,不然得设置边距,但是这样就不妥了,盖章需要在⽂字下⽅)
下⾯开始例⼦
⾸先,先写解压缩和压缩的功能,毕竟word是个zip包。
io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import org.apachemons.io.IOUtils;
ecption.DocxException;
ecption.GmrZipException;
public class DocxFile {
private ZipFile docxFile;
private String docxName;
private File file;
private Map<String, byte[]> updateEntryMap = new HashMap<String, byte[]>();
boolean tag = true;
/
**
* 初始化(docx)
*
* @param docxName
* docx⽂件名及路径如 web-inf/a.docx
*
*/
public DocxFile(String docxName) {
this.docxName = docxName;
try {
file = new File(docxName);
docxFile = new ZipFile(file);
} catch (ZipException e) {
throw new GmrZipException(e);
} catch (IOException e) {
throw new DocxException(e);
}
}
/**
* 获取docx压缩体内容
*
* @param entryName
* 压缩体名
*
* @return
*/
public InputStream getEntryInputStream(String entryName) { ZipEntry entry = Entry(entryName);
try {
return entry == null ? null : InputStream(entry);
} catch (IOException e) {
throw new DocxException(e);
}
}
/**
* 获取docx压缩体内容
*
* @param entry
* 压缩体
*
* @return
*/
public InputStream getEntryInputStream(ZipEntry entry) {
try {
InputStream(entry);
} catch (IOException e) {
throw new DocxException(e);
}
}
/**
* 获取指定⽂件夹下的ZipEntry
*
* @param directoryName
* @return
*/
public List<ZipEntry> getEntries(String directoryName) {
List<ZipEntry> list = new ArrayList<ZipEntry>();
Enumeration<? extends ZipEntry> entries = ies(); while (entries.hasMoreElements()) {
ZipEntry entry = Element();
String name = Name();
if (ains(directoryName)
|| ains(directoryName + "/")
|| ains(directoryName + "\\")) {
list.add(entry);
python转java代码}
}
return list;
}
/**
* 放置修改后的Entry
*
* @param entryName
* @param bs
*/
public void putUpdateEntry(String entryName, byte[] bs) { updateEntryMap.put(entryName, bs);
}
/**
* 修改当前的docx⽂件(这是⽂件名⾮空,也就是初始化时流的时候) *
* @throws Exception
*/
public void updateZip() throws Exception {
String suffix = "" + System.currentTimeMillis() + docxFile.hashCode() + updateEntryMap.hashCode();
File tFile = new File(docxName + suffix);
OutputStream out;
try {
out = new FileOutputStream(tFile);
} catch (FileNotFoundException e) {
throw new DocxException(e);
}
ZipOutputStream docxOut = new ZipOutputStream(out); Enumeration<? extends ZipEntry> zipEntrys = ies(); try {
// 原有的部分,包括修改后的覆盖原有的
while (zipEntrys.hasMoreElements()) {
ZipEntry zipEntry = Element();
docxOut.putNextEntry(new Name()));
if (Name())) {
byte[] b = (Name());
if (b != null && b.length > 0) {
docxOut.write(b);
}
} else {
InputStream in = InputStream(zipEntry);
}
}
// 表⽰新增的修改部分
for (Entry<String, byte[]> entry : Set()) { docxOut.putNextEntry(new Key())); docxOut.Value());
}
docxOut.flush();
} finally {
docxOut.close();
tag = false;
docxFile.close();
}
this.file.delete();
}
/**
* 关闭⽂件
*/
public void close() {
try {
if (tag) {
docxFile.close();
}
} catch (IOException e) {
throw new DocxException(e);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论