精华内容
下载资源
问答
  • 今天小编用Word 2016来教大家怎样统一图片缩小又不会降低图片的质量的详细教程!具体操作步骤如下:1、打开Word 2016 -- 点击菜单栏的“布局”选项卡 -- 点击“页边距”--“自定义页边距”。2、弹出“页面设置”...

    在Word文档中,如果一个文档插入很多张照片,而且图片大小不一,这时候如果你想让插入的图片统一大小你会怎么做?

    dcef297d8841cf184df14c5b27beb25f.png

    今天小编用Word 2016来教大家怎样统一让图片缩小又不会降低图片的质量的详细教程!

    具体操作步骤如下:

    1、打开Word 2016 -- 点击菜单栏的“布局”选项卡 -- 点击“页边距”--“自定义页边距”

    8c6f0c82fec4efb54bc1f36873491105.png

    2、弹出“页面设置”对话框 -- 将“左边距、右边距”的值设置的大一点 -- 点击“确定”按钮。

    c9f5d756c79236e3e416ccfe8b73cbde.png

    为什么要将左右页边距的值设置的大一点?

    因为页边距越大,图片就会越小。

    3、插入准备好的图片。点击菜单栏的“插入”选项卡 -- 在“插图”组中点击“图片”

    be1724a0ca84b82a93a146b18964d5d9.png

    4、弹出“插入图片”对话框 -- 选择要插入的图片 -- 点击“插入”按钮。

    0c26b6427806aef3dc0277456cb3f5f2.png

    5、可以看到图片插入到文档中图片的大小都是一样的,而且清晰度没有改变,如下图所示。

    91f09ff7d1a96bc5cb04f7e0926d05b5.png

    6、完整的动图演示。

    088f5ccb4c43845014fa7374a8f05f2b.gif

    以上统一设置图片缩小的方法您学会了吗?有问题可在评论区留言哦~期待您的关注、转发与点赞!

    您的关注、转发、评论、点赞、收藏都是对小编的鼓励与支持,谢谢您!

    d982ec6008c8d9a424515533e224d88f.png
    展开全文
  • 2.然后将缩放部分的锁定纵横比以及相对原始图片大小的勾选去掉,此处可以按照需求调节高德以及宽度的值,点击...如果需要保持原尺寸的纵横比,去掉的勾选处可以勾选上,就会以缩放模块的宽高百分比来缩放图片。 ...

    1.首先选择一张图片,点击格式菜单,找到大小模块的下角标,点击弹出布局大小的设置。

    2.然后将缩放部分的 锁定纵横比以及相对原始图片大小的勾选去掉,此处可以按照需求调节高德以及宽度的值,点击确定按钮。

    3.确定宽高,点击确定按钮后,参照的图片大小已经设置完毕。

    4.点击需要改变大小的其他图片,点击F4即可,此时图片大小会产生变化,会改变宽高的值,与参照图片宽高完全相同。

    如果需要保持原尺寸的纵横比,去掉的勾选处可以勾选上,就会以缩放模块的宽高百分比来缩放图片。

    展开全文
  • 还在为图片大小位置不统一而发愁吗,这样做出来的word文档不美观图片看起来也是大小不一很不协调。今天就教大家几个简单的处理图片的办法,快来学习吧!   1. 修改图片默认环绕方式 大家在word中插入图片的...

    还在为图片大小位置不统一而发愁吗,这样做出来的word文档不美观图片看起来也是大小不一很不协调。今天就教大家几个简单的处理图片的办法,快来学习吧!

    Word图片大小总是对不齐,如何统一图片的大小位置,看一眼就会!

     

    1. 修改图片默认环绕方式

    大家在word中插入图片的时候有没有遇到这样的麻烦,插入的图片无法移动,必须要手动设置一下环绕方式才可以移动图片,这样做太费事了,小编教你一个方法,直接修改环绕方式,这样就免去了手动设置。既省时又省力,快来尝试一下!

    Word图片大小总是对不齐,如何统一图片的大小位置,看一眼就会!

     

    2. 恢复图片原始尺寸

    我们通常插入的图片其实都是缩小了的,它并不是图片的原始尺寸,如果我们想要恢复图片的原始尺寸,只需要将我们插入的图片点击【格式】--【重设图片和大小】就可以了。

    Word图片大小总是对不齐,如何统一图片的大小位置,看一眼就会!

     

    3. 一次处理多个图片

    有的时候图片很多,需要将图片的大小尺寸处理成一致的,怎么办呢?我们只需要在插入图片之前先"新建绘图画布",在绘图画布中处理就好了。我们将图片【ctrl+A】全选进来对其宽度高度设置一下就可以了。

    Word图片大小总是对不齐,如何统一图片的大小位置,看一眼就会!

     

    各位老铁们,这些技巧对你们有帮助吗?喜欢的话单击点个关注吧!您的满意是小编最大的动力哦!

    Word图片大小总是对不齐,如何统一图片的大小位置,看一眼就会!

    展开全文
  • 实现html和word的相互转换(带图片

    万次阅读 多人点赞 2018-06-16 13:29:10
    目前从html转换的word为doc格式,而图片处理支持的是docx格式,所以需要手动把doc另存为docx,然后才可以进行图片替换。 一.添加maven依赖 主要使用了以下和poi相关的依赖,为了便于获取html的图片元素,还使用了...

    项目后端使用了springboot,maven,前端使用了ckeditor富文本编辑器。目前从html转换的word为doc格式,而图片处理支持的是docx格式,所以需要手动把doc另存为docx,然后才可以进行图片替换。

    2021年了,我回来填坑了,又碰到了需要把 html 转换成 word 的场景,目前对于格式不固定的带图片的导出,有以下解决方案:

    后端只做部分样式处理,导出工作交给前端完成,代码实现见第四部分。

    一.添加maven依赖

    主要使用了以下和poi相关的依赖,为了便于获取html的图片元素,还使用了jsoup:

    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi</artifactId>
    	<version>3.14</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi-scratchpad</artifactId>
    	<version>3.14</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi-ooxml</artifactId>
    	<version>3.14</version>
    </dependency>
    
    <dependency>
    	<groupId>fr.opensagres.xdocreport</groupId>
    	<artifactId>xdocreport</artifactId>
    	<version>1.0.6</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi-ooxml-schemas</artifactId>
    	<version>3.14</version>
    </dependency>
    
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>ooxml-schemas</artifactId>
    	<version>1.3</version>
    </dependency>
    
    <dependency>
    	<groupId>org.jsoup</groupId>
    	<artifactId>jsoup</artifactId>
    	<version>1.11.3</version>
    </dependency>
    

    二.word转换为html

    在springboot项目的resources目录下新建static文件夹,将需要转换的word文件temp.docx粘贴进去,由于static是springboot的默认资源文件,所以不需要在配置文件里面另行配置了,如果改成其他名字,需要在application.yml进行相应配置。

    doc格式转换为html:

    public static String docToHtml() throws Exception {
    	File path = new File(ResourceUtils.getURL("classpath:").getPath());
    	String imagePathStr = path.getAbsolutePath() + "\\static\\image\\";
    	String sourceFileName = path.getAbsolutePath() + "\\static\\test.doc";
    	String targetFileName = path.getAbsolutePath() + "\\static\\test2.html";
    	File file = new File(imagePathStr);
    	if(!file.exists()) {
    		file.mkdirs();
    	}
    	HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(sourceFileName));
    	org.w3c.dom.Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
    	WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(document);
    	//保存图片,并返回图片的相对路径
    	wordToHtmlConverter.setPicturesManager((content, pictureType, name, width, height) -> {
    		try (FileOutputStream out = new FileOutputStream(imagePathStr + name)) {
    			out.write(content);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return "image/" + name;
    	});
    	wordToHtmlConverter.processDocument(wordDocument);
    	org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument();
    	DOMSource domSource = new DOMSource(htmlDocument);
    	StreamResult streamResult = new StreamResult(new File(targetFileName));
    	TransformerFactory tf = TransformerFactory.newInstance();
    	Transformer serializer = tf.newTransformer();
    	serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    	serializer.setOutputProperty(OutputKeys.INDENT, "yes");
    	serializer.setOutputProperty(OutputKeys.METHOD, "html");
    	serializer.transform(domSource, streamResult);
    	return targetFileName;
    }
    

    docx格式转换为html

    public static String docxToHtml() throws Exception {
    	File path = new File(ResourceUtils.getURL("classpath:").getPath());
    	String imagePath = path.getAbsolutePath() + "\\static\\image";
    	String sourceFileName = path.getAbsolutePath() + "\\static\\test.docx";
    	String targetFileName = path.getAbsolutePath() + "\\static\\test.html";
    
    	OutputStreamWriter outputStreamWriter = null;
    	try {
    		XWPFDocument document = new XWPFDocument(new FileInputStream(sourceFileName));
    		XHTMLOptions options = XHTMLOptions.create();
    		// 存放图片的文件夹
    		options.setExtractor(new FileImageExtractor(new File(imagePath)));
    		// html中图片的路径
    		options.URIResolver(new BasicURIResolver("image"));
    		outputStreamWriter = new OutputStreamWriter(new FileOutputStream(targetFileName), "utf-8");
    		XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
    		xhtmlConverter.convert(document, outputStreamWriter, options);
    	} finally {
    		if (outputStreamWriter != null) {
    			outputStreamWriter.close();
    		}
    	}
    	return targetFileName;
    }
    

    转换成功后会生成对应的html文件,如果想在前端展示,直接读取文件转换为String返回给前端即可。

    public static String readfile(String filePath) {
    	File file = new File(filePath);
    	InputStream input = null;
    	try {
    		input = new FileInputStream(file);
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	}
    	StringBuffer buffer = new StringBuffer();
    	byte[] bytes = new byte[1024];
    	try {
    		for (int n; (n = input.read(bytes)) != -1;) {
    			buffer.append(new String(bytes, 0, n, "utf8"));
    		}
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    	return buffer.toString();
    }
    

    在富文本编辑器ckeditor中的显示效果:
    这里写图片描述

    三.html转换为word

    实现思路就是先把html中的所有图片元素提取出来,统一替换为变量字符"${imgReplace}“,如果多张图片,可以依序排列下去,之后生成对应的doc文件(之前试过直接生成docx文件发现打不开,这个问题尚未找到好的解决方法),我们将其另存为docx文件,之后就可以替换变量为图片了:

    public static String writeWordFile(String content) {
    		String path = "D:/wordFile";
    		Map<String, Object> param = new HashMap<String, Object>();
    
    		if (!"".equals(path)) {
    			File fileDir = new File(path);
    			if (!fileDir.exists()) {
    				fileDir.mkdirs();
    			}
    			content = HtmlUtils.htmlUnescape(content);
    			List<HashMap<String, String>> imgs = getImgStr(content);
    			int count = 0;
    			for (HashMap<String, String> img : imgs) {
    				count++;
    				//处理替换以“/>”结尾的img标签
    				content = content.replace(img.get("img"), "${imgReplace" + count + "}");
    				//处理替换以“>”结尾的img标签
    				content = content.replace(img.get("img1"), "${imgReplace" + count + "}");
    				Map<String, Object> header = new HashMap<String, Object>();
    
    				try {
    					File filePath = new File(ResourceUtils.getURL("classpath:").getPath());
    					String imagePath = filePath.getAbsolutePath() + "\\static\\";
    					imagePath += img.get("src").replaceAll("/", "\\\\");
    					//如果没有宽高属性,默认设置为400*300
    					if(img.get("width") == null || img.get("height") == null) {
    						header.put("width", 400);
    						header.put("height", 300);
    					}else {
    						header.put("width", (int) (Double.parseDouble(img.get("width"))));
    						header.put("height", (int) (Double.parseDouble(img.get("height"))));
    					}
    					header.put("type", "jpg");
    					header.put("content", OfficeUtil.inputStream2ByteArray(new FileInputStream(imagePath), true));
    				} catch (FileNotFoundException e) {
    					e.printStackTrace();
    				}
    				param.put("${imgReplace" + count + "}", header);
    			}
    			try {
    				// 生成doc格式的word文档,需要手动改为docx
    				byte by[] = content.getBytes("UTF-8");
    				ByteArrayInputStream bais = new ByteArrayInputStream(by);
    				POIFSFileSystem poifs = new POIFSFileSystem();
    				DirectoryEntry directory = poifs.getRoot();
    				DocumentEntry documentEntry = directory.createDocument("WordDocument", bais);
    				FileOutputStream ostream = new FileOutputStream("D:\\wordFile\\temp.doc");
    				poifs.writeFilesystem(ostream);
    				bais.close();
    				ostream.close();
    
    				// 临时文件(手动改好的docx文件)
    				CustomXWPFDocument doc = OfficeUtil.generateWord(param, "D:\\wordFile\\temp.docx");
    				//最终生成的带图片的word文件
    				FileOutputStream fopts = new FileOutputStream("D:\\wordFile\\final.docx");
    				doc.write(fopts);
    				fopts.close();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    
    		}
    		return "D:/wordFile/final.docx";
    	}
    	
    	//获取html中的图片元素信息
    	public static List<HashMap<String, String>> getImgStr(String htmlStr) {
    		List<HashMap<String, String>> pics = new ArrayList<HashMap<String, String>>();
    
    		Document doc = Jsoup.parse(htmlStr);
    		Elements imgs = doc.select("img");
    		for (Element img : imgs) {
    			HashMap<String, String> map = new HashMap<String, String>();
    			if(!"".equals(img.attr("width"))) {
    				map.put("width", img.attr("width").substring(0, img.attr("width").length() - 2));
    			}
    			if(!"".equals(img.attr("height"))) {
    				map.put("height", img.attr("height").substring(0, img.attr("height").length() - 2));
    			}
    			map.put("img", img.toString().substring(0, img.toString().length() - 1) + "/>");
    			map.put("img1", img.toString());
    			map.put("src", img.attr("src"));
    			pics.add(map);
    		}
    		return pics;
    	}
    

    OfficeUtil工具类,之前发现网上的写法只支持一张图片的修改,多张图片就会报错,是因为添加了图片,processParagraphs方法中的runs的大小改变了,会报ArrayList的异常,就和我们循环list中删除元素会报异常道理一样,解决方法就是复制一个新的Arraylist进行循环:

    package com.example.demo.util;  
      
    import java.io.ByteArrayInputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.hwpf.extractor.WordExtractor;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.apache.poi.xwpf.usermodel.XWPFTable;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.apache.poi.xwpf.usermodel.XWPFTableRow;  
      
    /** 
     * 适用于word 2007
     */  
    public class OfficeUtil {  
      
        /** 
         * 根据指定的参数值、模板,生成 word 文档 
         * @param param 需要替换的变量 
         * @param template 模板 
         */  
        public static CustomXWPFDocument generateWord(Map<String, Object> param, String template) {  
            CustomXWPFDocument doc = null;
            try {  
                OPCPackage pack = POIXMLDocument.openPackage(template);  
                doc = new CustomXWPFDocument(pack);  
                if (param != null && param.size() > 0) {  
                      
                    //处理段落  
                    List<XWPFParagraph> paragraphList = doc.getParagraphs();  
                    processParagraphs(paragraphList, param, doc);  
                      
                    //处理表格  
                    Iterator<XWPFTable> it = doc.getTablesIterator();  
                    while (it.hasNext()) {
                        XWPFTable table = it.next();  
                        List<XWPFTableRow> rows = table.getRows();  
                        for (XWPFTableRow row : rows) {  
                            List<XWPFTableCell> cells = row.getTableCells();  
                            for (XWPFTableCell cell : cells) {  
                                List<XWPFParagraph> paragraphListTable =  cell.getParagraphs();  
                                processParagraphs(paragraphListTable, param, doc);  
                            }  
                        }  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return doc;  
        }  
        /** 
         * 处理段落 
         * @param paragraphList 
         */  
        public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String, Object> param,CustomXWPFDocument doc){  
            if(paragraphList != null && paragraphList.size() > 0){  
                for(XWPFParagraph paragraph:paragraphList){
                	//poi转换过来的行间距过大,需要手动调整
                	if(paragraph.getSpacingBefore() >= 1000 || paragraph.getSpacingAfter() > 1000) {
                		paragraph.setSpacingBefore(0);
                    	paragraph.setSpacingAfter(0);
                	}
                	//设置word中左右间距
                	paragraph.setIndentationLeft(0);
                	paragraph.setIndentationRight(0);
                	List<XWPFRun> runs = paragraph.getRuns();
                	//加了图片,修改了paragraph的runs的size,所以循环不能使用runs
                	List<XWPFRun> allRuns = new ArrayList<XWPFRun>(runs);
                	for (XWPFRun run : allRuns) {
                        String text = run.getText(0);  
                        if(text != null){
                            boolean isSetText = false;  
                            for (Entry<String, Object> entry : param.entrySet()) {  
                                String key = entry.getKey();  
                                if(text.indexOf(key) != -1){  
                                    isSetText = true;  
                                    Object value = entry.getValue();  
                                    if (value instanceof String) {//文本替换  
                                        text = text.replace(key, value.toString());  
                                    } else if (value instanceof Map) {//图片替换  
                                        text = text.replace(key, "");  
                                        Map pic = (Map)value;  
                                        int width = Integer.parseInt(pic.get("width").toString());  
                                        int height = Integer.parseInt(pic.get("height").toString());  
                                        int picType = getPictureType(pic.get("type").toString());  
                                        byte[] byteArray = (byte[]) pic.get("content");  
                                        ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);  
                                        try {  
                                            String blipId = doc.addPictureData(byteInputStream,picType);  
                                            doc.createPicture(blipId,doc.getNextPicNameNumber(picType), width, height,paragraph);
                                        } catch (Exception e) {  
                                            e.printStackTrace();  
                                        }  
                                    }  
                                }  
                            }  
                            if(isSetText){  
                                run.setText(text,0);  
                            }  
                        }  
                    }  
                }  
            }  
        }  
        /** 
         * 根据图片类型,取得对应的图片类型代码 
         * @param picType 
         * @return int 
         */  
        private static int getPictureType(String picType){  
            int res = CustomXWPFDocument.PICTURE_TYPE_PICT;  
            if(picType != null){  
                if(picType.equalsIgnoreCase("png")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_PNG;  
                }else if(picType.equalsIgnoreCase("dib")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_DIB;  
                }else if(picType.equalsIgnoreCase("emf")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_EMF;  
                }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_JPEG;  
                }else if(picType.equalsIgnoreCase("wmf")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_WMF;  
                }  
            }  
            return res;  
        }  
        /** 
         * 将输入流中的数据写入字节数组 
         * @param in 
         * @return 
         */  
        public static byte[] inputStream2ByteArray(InputStream in,boolean isClose){  
            byte[] byteArray = null;  
            try {  
                int total = in.available();  
                byteArray = new byte[total];  
                in.read(byteArray);  
            } catch (IOException e) {  
                e.printStackTrace();  
            }finally{  
                if(isClose){  
                    try {  
                        in.close();  
                    } catch (Exception e2) {  
                        System.out.println("关闭流失败");  
                    }  
                }  
            }  
            return byteArray;  
        }  
    }
    

    我认为之所以word2003不支持图片替换,主要是因为处理2003版本的HWPFDocument对象被声明为了final,我们就无法重写他的方法了。

    而处理2007版本的类为XWPFDocument,是可以继承的,通过继承XWPFDocument,重写createPicture方法即可实现图片替换,以下为对应的CustomXWPFDocument类:

    package com.example.demo.util;    
        
    import java.io.IOException;  
    import java.io.InputStream;  
    import org.apache.poi.openxml4j.opc.OPCPackage;  
    import org.apache.poi.xwpf.usermodel.XWPFDocument;  
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;  
    import org.apache.xmlbeans.XmlException;  
    import org.apache.xmlbeans.XmlToken;  
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;  
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;  
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;  
        
    /** 
     * 自定义 XWPFDocument,并重写 createPicture()方法 
     */  
    public class CustomXWPFDocument extends XWPFDocument {    
        public CustomXWPFDocument(InputStream in) throws IOException {    
            super(in);    
        }    
        
        public CustomXWPFDocument() {    
            super();    
        }    
        
        public CustomXWPFDocument(OPCPackage pkg) throws IOException {    
            super(pkg);    
        }    
        
        /** 
         * @param ind 
         * @param width 宽 
         * @param height 高 
         * @param paragraph  段落 
         */  
        public void createPicture(String blipId, int ind, int width, int height,XWPFParagraph paragraph) {    
            final int EMU = 9525;    
            width *= EMU;    
            height *= EMU;    
            CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();    
            String picXml = ""    
                    + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"    
                    + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
                    + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""    
                    + ind    
                    + "\" name=\"Generated\"/>"    
                    + "            <pic:cNvPicPr/>"    
                    + "         </pic:nvPicPr>"    
                    + "         <pic:blipFill>"    
                    + "            <a:blip r:embed=\""    
                    + blipId    
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"    
                    + "            <a:stretch>"    
                    + "               <a:fillRect/>"    
                    + "            </a:stretch>"    
                    + "         </pic:blipFill>"    
                    + "         <pic:spPr>"    
                    + "            <a:xfrm>"    
                    + "               <a:off x=\"0\" y=\"0\"/>"    
                    + "               <a:ext cx=\""    
                    + width    
                    + "\" cy=\""    
                    + height    
                    + "\"/>"    
                    + "            </a:xfrm>"    
                    + "            <a:prstGeom prst=\"rect\">"    
                    + "               <a:avLst/>"    
                    + "            </a:prstGeom>"    
                    + "         </pic:spPr>"    
                    + "      </pic:pic>"    
                    + "   </a:graphicData>" + "</a:graphic>";    
        
            inline.addNewGraphic().addNewGraphicData();    
            XmlToken xmlToken = null;    
            try {    
                xmlToken = XmlToken.Factory.parse(picXml);    
            } catch (XmlException xe) {    
                xe.printStackTrace();    
            }    
            inline.set(xmlToken);   
              
            inline.setDistT(0);      
            inline.setDistB(0);      
            inline.setDistL(0);      
            inline.setDistR(0);      
              
            CTPositiveSize2D extent = inline.addNewExtent();    
            extent.setCx(width);    
            extent.setCy(height);    
              
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();      
            docPr.setId(ind);      
            docPr.setName("图片" + ind);      
            docPr.setDescr("测试");   
        }    
    }
    

    以上就是通过POI实现html和word的相互转换,对于html无法转换为可读的docx这个问题,不是很好解决。

    html和word的相互转换也可以通过 freemarker 模板的方式实现,这个是同事给的思路,我没有尝试,大家有兴趣的可以试试,缺点就是模板是固定的,不够灵活,不适用于经常变动的网页。

    历经两年多又发现了一个新的解决方案,亲测可用,见第四部分。

    四.html转换为word之前端实现

    前端实现的方法比较灵活,也支持表格,echarts 的导出,使用 file-saver 插件实现。

    在 vue 和 angular 下测试了都可以用,而后端只需要对图片和样式进行处理,转换和导出工作交给前端来做(后端同学露出了如释重负的笑容)。

    java 代码实现

    controller 实现:

        @PostMapping("/article/htmlFormat")
        public Ret html(String html) throws Exception {
            return articleService.formatHtmlStyle(html);
        }
    

    service 实现:

    	// 实现图片和样式处理的方法
    	public Ret formatHtmlStyle(String html) {
        	JSONArray picsArr = new JSONArray();
    
            // 缩小图片
            Document doc = Jsoup.parse(html);
    
            Elements elementsP = doc.getElementsByTag("p");
            for (int i = 0; i < elementsP.size(); i++) {
                Element element = elementsP.get(i);
                boolean hasImg = false;
                Elements elementsChildren = element.children();
                for (int j = 0; j < elementsChildren.size(); j++) {
                    Element elementChild = elementsChildren.get(j);
                    if (elementChild.nodeName().equals("img")) {
                        hasImg = true;
                        break;
                    }
                }
                if (hasImg) {
                    element.attr("style", "text-align: center ;");
                } else {
                    element.attr("style",
                            "font-family: FangSong_GB2312 ;font-size:18px;text-indent: 2em ;line-height:34px;text-align:justify;");
                }
    
            }
    
            Elements elements = doc.getElementsByTag("img");
            for (int i = 0; i < elements.size(); i++) {
                Element element = elements.get(i);
                String src = element.attr("src");
                JSONObject picjo = new JSONObject();
                picjo.put("index", i);
                // 将网络图片转为 base64 格式
                picjo.put("src", CommonUtil.urlToBase64(src));
                picsArr.add(picjo);
                element.attr("src", "" + i);
            }
            Ret ret = Ret.create().setCodeAndMsg(200).set("html", doc.body().html()).set("pics", picsArr);
            return ret;  
    	}
    

    注意事项:

    1.这里的Ret就是一个结果封装类,不是重点,只要把 html 和 pics 返回即可。

    2.html 中的图片路径是网络图片,需要转换为 base64 才能在 word 中显示。

    CommonUtil 中的转换代码如下:

    public static String urlToBase64(String imgUrl) {
            InputStream inputStream = null;
            ByteArrayOutputStream outputStream = null;
            byte[] buffer = null;
            try {
                // 创建URL
                URL url = new URL(imgUrl);
                // 创建链接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5000);
                inputStream = conn.getInputStream();
                outputStream = new ByteArrayOutputStream();
                // 将内容读取内存中
                buffer = new byte[1024];
                int len = -1;
                while ((len = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, len);
                }
                buffer = outputStream.toByteArray();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    try {
                        // 关闭inputStream流
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (outputStream != null) {
                    try {
                        // 关闭outputStream流
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            // 对字节数组Base64编码
            String base64 = "data:image/png;base64," + new BASE64Encoder().encode(buffer);
            return base64;
        }
    

    vue 代码实现

    1.安装 file-saver

    npm install file-saver --save
    bower install file-saver
    

    如果提示 “bower不是内部或外部命令”,需要安装bower

    npm install -g bower
    

    安装 TypeScript 定义

    npm install @types/file-saver --save-dev
    

    2.使用

    导入 saveAs

    import { saveAs } from 'file-saver';
    

    实现下载处理逻辑

    downloadArticle: function() {
        var FileSaver = require('file-saver');
        var html = "这里是你的html内容";
        //var html = "<html>" + this.$refs.article.innerHTML + "</html>";
        var param = new URLSearchParams();
        param.append('html', html);
        // 调用上面的 java 接口获取处理后的html内容
        this.$axios({
            method: 'post',
            url: '/article/htmlFormat',
            data: param
        }).then((response) = > {
            const _static = {
                mhtml: {
                    top: "Mime-Version: 1.0\nContent-Base: " + location.href + "\nContent-Type: Multipart/related; boundary=\"NEXT.ITEM-BOUNDARY\";type=\"text/html\"\n\n--NEXT.ITEM-BOUNDARY\nContent-Type: text/html; charset=\"utf-8\"\nContent-Location: " + location.href + "\n\n<!DOCTYPE html>\n<html>\n_html_</html>",
                    head: "<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<style>\n_styles_\n</style>\n</head>\n",
                    body: "<body>_body_</body>"
                }
            };
            const dealhtml = response.data.html;
            const img = response.data.pics;
            let mhtmlBottom = "\n";
            for (let i = 0; i < img.length; i++) {
                const uri = img[i].src;
                const index = img[i].index;
                mhtmlBottom += "--NEXT.ITEM-BOUNDARY\n";
                mhtmlBottom += "Content-Location: " + index + "\n";
                mhtmlBottom += "Content-Type: " + uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")) + "\n";
                mhtmlBottom += "Content-Transfer-Encoding: " + uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")) + "\n\n";
                mhtmlBottom += uri.substring(uri.indexOf(",") + 1) + "\n\n";
            }
            mhtmlBottom += "--NEXT.ITEM-BOUNDARY--";
            // 整合html代码片段
            const fileContent = _static.mhtml.top.replace("_html_", _static.mhtml.body.replace("_body_", dealhtml)) + mhtmlBottom;
            // 导出
            const blob = new Blob([fileContent], {
                type: "application/msword;charset=utf-8"
            });
            saveAs(blob, `testImage.doc`);
        });
    }
    

    注意事项:

    不要图省事在后端把 base64 写在 image 标签的 src 里面,这样会导致导出的word文档只有在切换为编辑视图后才能显示图片。

    最终效果:

    在这里插入图片描述

    展开全文
  • 最近小编遇到一个问题:需要将一篇word文档中的所有图片全部缩小比例。一张张改太麻烦了。于是从网上搜罗了一下,还真找到了解决办法。需要注意的地方就是注意厘米与像素的换算关系。一般情况下1厘米=28px 。这个...
  • 使用宏批量处理word中的图片大小

    千次阅读 2011-08-05 14:33:21
    我有一个word文档,里面有多幅图,但图片的缩进位置不统一,有些靠右,有些居中,有些靠左等等。 能否通过编制宏一次完成调整,让所有图片靠左,或居中。 我知道通过宏可以批量完成一个word中所有图片大小的...
  • 而今天我们只说说 transform 属性对图片进行等比例的缩放操作。css transform 属性的介绍transform:该属性向元素应用 2D 或 3D 转换。它允许我们对元素进行旋转、缩放、移动或倾斜的操作。缩放使用值:scaleY(n):...
  • Word2013批量修改图片尺寸

    千次阅读 2019-08-06 14:37:02
    保持图片原始比例(锁定横纵比例)的情况下,批量调整为适应页面尺寸的图片大小。 名词 LockAspectRatio - 锁定横纵比例, MsoTrue if the specified shape retains its original proportions when you resize it. ...
  •  word书写过程有时候需要批量修改图片大小使得格式统一化,对每个图片进行修改费时费力,写了一些小程序批量修改希望对需要经常写word的人有帮助。 2.程序 2.1图片大小调整 ' Sub 图片格式调整() ' ' 图片格式...
  • word批量修改图片大小——固定长宽篇 这部分要说的是把word中的所有图片修改成固定的并且相同的长和宽! 1、打开word,工具-宏-宏(或者直接按Alt+F8)进入宏的界面,如下面所示,输入一个宏名,宏名自己起,能...
  • 我的word中的图片只显示一个方框,这个问题困扰我有一段时间了,今天终于搞定。 原因如下: Word中不能显示公式 问:在Word 2003中编辑好的公式无法显示,只显示为一个方框,该怎么办? 答:Word把使用公式编辑...
  • 写blog的习惯,先在word写了,复制到windows live ...word中的文章,图片缩放比例,复制到windows live writer后图片变得不清晰。除了一张一张 设置图片缩放比例为100%外,再复制到windows live writer。这样做...
  • Sub tongyixiugaichicun() Dim oInlineShape As InlineShape For Each oInlineShape In ActiveDocument.InlineShapes With oInlineShape .LockAspectRatio = msoFalse '不锁定纵横比 ' .ScaleHeight = 10 ...
  • 主要介绍 word 文档中插入图片、设置图片大小;插入表格、设置表格样式、字体样式;章节设置:页面大小、边距等;设置页眉页脚等方法。
  • word文档是文字、排版什么的都做完了,只想批量调一下图片尺寸。发现无论是word和还是wps都无法用快捷键选中所有图片。后面用宏解决了批量修改的问题。
  • 在论文中直接插入visio导出的png或其他格式的图片会很不清晰,我们可以在word中直接插入visio对象。 在“插入”栏目中选择“对象”,下拉依旧选择“对象” 可以选择“新建”一个visio对象,也可以选择“由文件创建”...
  • 6、批量缩放图片:按指定的倍数批量放大图片,或者按指定的百分比批量缩小图片。 7、批量插入图片:批量插入图片到当前文档中,可以选择图片名称的显示方式,以及定义图片的高度。 8、转换图片格式:将指定路径中的...
  • 批量缩放图片 按指定的倍数批量放大图片,或者按指定的百分比批量缩小图片。 统一图片尺寸 将指定路径中的所有图片统一分辨率。 转换图片格式 将指定路径中的所有图片统一转换成相同的格式。 批量插入图片 批量插入...
  • 有时候需要编辑嵌入到WORD或者WPS中的VISIO图片,如何能够让图片可以自动调整大小呢,其实很简单,双击图片,到VISIO窗口,点击菜单:文件-页面设置,切换到“页面尺寸”,选中“调整大小以适应绘图内容”,然后点...
  • word技巧

    千次阅读 2018-03-01 21:40:22
    word 高效经典教程(整理版)目录一分钟驾驭word 高效经典教程(整理版)... 6A、基础知识... 61、度量单位... 62、WORD中文字字号与磅的对应关系... 63、字体文件格式... 7B、文本编辑... 71、快速移动文档... 72、...
  • (2)等比例缩放 n倍 : Sub resetImgSize() Dim imgHeight Dim imgWidth Dim iShape As InlineShape For Each iShape In ActiveDocument.InlineShapes iShape.LockAspectRatio = msoTrue imgHeight = ...
  • 文章目录前言全局设置效果类修改字体、颜色、字体大小、行高等文字居中(靠右)对齐图片转存至相对路径图片缩放图片居中内容类Excel的表格与Markdown表格的互转`mermaid`相关使用特殊文字使用`classDef`语法来自定义`...
  • word操作

    2019-10-13 15:56:20
    WORD初识 键盘快捷键:文档内容的选取 word的本质是个压缩包 模板下载&模板路径 WORD选项 格式刷 限制编辑 字体 段落 查找 /替换 通配符的查找&替换 插入 绘图工具 分节符 颜色 英文的审阅 ...
  • Word 混合排版

    2020-06-17 13:55:12
    将对象组合起来可以统一进行编辑,比如移动、调整大小等。 按ctrl+拖动=复制 按shift+逐个单击=多选 按shift去绘制图形可以绘制出等比例放大或缩小的图形。 2、叠放顺序 后添加的对象会遮盖前面的对象,是有层次的...
  • 1、即时取消 Word 的后台打印当我们刚刚编辑完一篇文档按了打印命令后,后来又不想打印当前的文档了,那么怎样才能即时取消后台打印任务呢?一般来说,大家在发出打印任务后,程序会自动将打印任务设置为后台打印,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,171
精华内容 2,868
关键字:

word统一缩小图片