一开始有这个需求,是想转成html合成pdf这样做,没想到转了之后格式错误,不得不停止,几经搜索,知道有docx4j
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import org.apache.commons.io.IOUtils; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.PartName; import org.docx4j.openpackaging.parts.WordprocessingML.AlternativeFormatInputPart; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.relationships.Relationship; import org.docx4j.wml.CTAltChunk; public class DocxUtil {
/** * 合并docx * @param streams * @return * @throws Docx4JException * @throws IOException */ public static InputStream mergeDocx(final List<InputStream> streams) throws Docx4JException, IOException { WordprocessingMLPackage target = null; final File generated = File.createTempFile("generated", ".docx"); int chunkId = 0; Iterator<InputStream> it = streams.iterator(); while (it.hasNext()) { InputStream is = it.next(); if (is != null) { if (target == null) { // Copy first (master) document OutputStream os = new FileOutputStream(generated); os.write(IOUtils.toByteArray(is)); os.close(); target = WordprocessingMLPackage.load(generated); } else { // Attach the others (Alternative input parts) insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(is), chunkId++); } } } if (target != null) { target.save(generated); return new FileInputStream(generated); } else { return null; } } // 插入文档 private static void insertDocx(MainDocumentPart main, byte[] bytes, int chunkId) { try { AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart( new PartName("/part" + chunkId + ".docx")); // afiPart.setContentType(new ContentType(CONTENT_TYPE)); afiPart.setBinaryData(bytes); Relationship altChunkRel = main.addTargetPart(afiPart); CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk(); chunk.setId(altChunkRel.getId()); main.addObject(chunk); } catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args) {
List li=new ArrayList();
for (int i = 0; i < urls.size(); i++) {
URL url = new URL(urls.get(i));
URLConnection conn = url.openConnection();// 打开链接
InputStream is = conn.getInputStream();// 获取数据流
li.add(is);
}
InputStream input=DocxUtil.mergeDocx(li);
byte[] buffer = new byte[256];
int b= 0;
while((b=input.read(buffer)) != -1){
//4.写到输出流(out)中
out.write(buffer,0,b);
}
}
//附上原来用zip做的,1个zip包里多个doc,用起来很难受
OutputStream out = response.getOutputStream();
response.setCharacterEncoding("utf-8");
response.setContentType("application/zip");
response.setHeader("Content-disposition",
"attachment;filename=" + new String((groupNum+"wordword").toString().getBytes("utf-8"), "ISO-8859-1")
+ ".zip");
StringBuilder entryname = null;
ZipEntry tempEntry = null;
ZipOutputStream tempZStream = new ZipOutputStream(new BufferedOutputStream(out));
try {
int i = 0;
int b = 0;
byte[] buffer = new byte[512];
for (InputStream input : li) {
entryname = new StringBuilder("");
entryname.append( mapList.get(i).get("XM")+"-"+"wordwordzip").append(".docx");
tempEntry = new ZipEntry(entryname.toString());
tempEntry.setMethod(ZipEntry.DEFLATED);
// tempEntry.setSize((long) letterInfo.length);
tempZStream.putNextEntry(tempEntry);
while ((b=input.read(buffer)) != -1){
//4.写到输出流(out)中
tempZStream.write(buffer,0,b);
}
i++;
}