java下载附件给(pdf、pptx、word、excel、图片)添加水印

使用组件 poi itext spire.xls ooxml-schemas twelvemonkeys.imageio 等

下载 pdf 含水印 最好使用 高版本

maven 配置

      <!-- pdf  --><itext.version>7.0.3</itext.version><!-- PDF --><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>${itext.version}</version><type>pom</type></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>kernel</artifactId><version>${itext.version}</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>io</artifactId><version>${itext.version}</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>layout</artifactId><version>${itext.version}</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>forms</artifactId><version>${itext.version}</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>pdfa</artifactId><version>${itext.version}</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>pdftest</artifactId><version>${itext.version}</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>font-asian</artifactId><version>${itext.version}</version></dependency><!-- word --><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc.free</artifactId><version>2.7.3</version></dependency><!-- excel  --><dependency><groupId>e-iceblue</groupId><artifactId>spire.xls.free</artifactId><version>2.2.0</version></dependency><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>2.2.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency><!-- ppt --><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.0</version><exclusions><!--解决含嵌入文件ppt转换报错 ArrayStoreException--><exclusion><artifactId>xmlbeans</artifactId><groupId>org.apache.xmlbeans</groupId></exclusion></exclusions></dependency><dependency><groupId>com.twelvemonkeys.servlet</groupId><artifactId>servlet</artifactId><version>3.6</version></dependency><!-- 图片 --><!--twelvemonkeys图片处理--><dependency><groupId>com.twelvemonkeys.imageio</groupId><artifactId>imageio-jpeg</artifactId><version>3.6</version></dependency><dependency><groupId>com.twelvemonkeys.imageio</groupId><artifactId>imageio-tiff</artifactId><version>3.6</version></dependency><repositories><repository><id>com.e-iceblue</id><url>http://repo.e-iceblue.cn/repository/maven-public/</url></repository><repository><id>com.e-iceblue</id><url>http://repo.e-iceblue.com/nexus/content/groups/public/</url></repository></repositories>

代码工具类 完成实现


package org.springblade.common.file;import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.Section;
import com.spire.doc.TextWatermark;
import com.spire.doc.documents.WatermarkLayout;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springblade.core.boot.ctrl.BladeController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.*;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.UUID;## downloadFile  方法为整体实现编写/*** 文件上传* @date 2021-05-19 11:02:20*/
@RestController
@RequestMapping("common/sysFile")
public class FileController extends BladeController {@ResponseBody@RequestMapping(value = "/download", method = RequestMethod.GET)public void downloadFile(@RequestParam("file") String fileName, HttpServletResponse response) throws ServletException, IOException {//获取文件后缀String prefix = fileName.substring((fileName.lastIndexOf(".") + 1));//这里文件名称是通过参数传递过来的,要是不需要,直接可以写在这里。String fileName = "a.doc";String path = "E://ChromeDownLoad//";  //这里指定路径在C盘根目录,按需改动即可FileInputStream fis = null;BufferedInputStream bis = null;ByteArrayOutputStream baos =null;XSSFWorkbook workbook = null;Document document = null;XMLSlideShow slideShow = null;FileOutputStream outImgStream = null;try {if(prefix.equals("pdf")) {File file = new File(path, fileName);response.setContentType("application/x-download;charset=UTF-8");fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");response.addHeader("Content-Disposition", "attachment; filename = " + fileName);fis = new FileInputStream(file);bis = new BufferedInputStream(fis);baos = new ByteArrayOutputStream();PdfReader readerInfo = new PdfReader(fis);PdfDocument docInfo = new PdfDocument(readerInfo, new PdfWriter(baos));//中文字体File tempFile = File.createTempFile(UUID.randomUUID().toString().replaceAll("-", ""), ".otf");InputStream input = new ClassPathResource("NotoSerifCJKsc.otf").getInputStream();Files.copy(input, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);String fontPath = tempFile.getAbsolutePath();addWater(docInfo, fontPath);// 5.关闭文档docInfo.close();readerInfo.close();ServletOutputStream fos = response.getOutputStream();fos.write(baos.toByteArray());fos.flush();fos.close();}if(prefix.equals("doc")||prefix.equals("docx")){// 生成word添加水印文件存储到指定目录File file = new File(path, fileName);document = new Document();document.loadFromFile(file.toString());InsertTextWatermark(document.getSections().get(0));document.saveToFile("D://ChromeDownLoad//"+file.getName(), FileFormat.Docx );// 从存得的目录中取出并下载String pathDOC = "D://ChromeDownLoad//";File fileS = new File(pathDOC, file.getName());response.setContentType("application/octet-stream;charset=UTF-8");String fileNamedoc = new String(fileS.getName().getBytes("UTF-8"), "iso-8859-1");response.addHeader("Content-Disposition", "attachment; filename = " + fileNamedoc);fis = new FileInputStream(fileS);bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());byte[] buf = new byte[4096];int length = bis.read(buf);//保存文件while(length != -1){bos.write(buf, 0, length);length = bis.read(buf);}bos.flush();bos.close();bis.close();}if(prefix.equals("xls")||prefix.equals("xlsx")){File file = new File(path, fileName);//读取excel文件workbook = new XSSFWorkbook(new FileInputStream(file));OutputStream fos = null;ByteArrayOutputStream os = null;//获取水印os = getImage("测试水印成功");int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表XSSFSheet sheet1 = workbook.getSheetAt(i);String rID = sheet1.addRelation(null, XSSFRelation.IMAGES, workbook.getAllPictures().get(pictureIdx)).getRelationship().getId();sheet1.getCTWorksheet().addNewPicture().setId(rID);}// Excel文件生成后存储的位置。File fileExcel = new File("D://ChromeDownLoad//"+file.getName());fos = new FileOutputStream(fileExcel);workbook.write(fos);// 从存得的目录中取出并下载response.setContentType("application/octet-stream;charset=UTF-8");String fileNamedoc = new String(fileExcel.getName().getBytes("UTF-8"), "iso-8859-1");response.addHeader("Content-Disposition", "attachment; filename = " + fileNamedoc);fis = new FileInputStream(fileExcel);bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());byte[] buf = new byte[4096];int length = bis.read(buf);//保存文件while(length != -1){bos.write(buf, 0, length);length = bis.read(buf);}bos.flush();bos.close();bis.close();}if(prefix.equals("ppt")||prefix.equals("pptx")){File file = new File(path, fileName);slideShow = new XMLSlideShow(new FileInputStream(file));ByteArrayOutputStream os = null;FileOutputStream out = null;//获取水印os = getImage("测试水印成功");PictureData pictureData1 = slideShow.addPicture(os.toByteArray(), PictureData.PictureType.PNG);for (XSLFSlide slide : slideShow.getSlides()) {XSLFPictureShape pictureShape = slide.createPicture(pictureData1);pictureShape.setAnchor(pictureShape.getAnchor());}// Excel文件生成后存储的位置。File fileExcel = new File("D://ChromeDownLoad//"+file.getName());out = new FileOutputStream(fileExcel);slideShow.write(out);// 从存得的目录中取出并下载response.setContentType("application/octet-stream;charset=UTF-8");String fileNamedoc = new String(fileExcel.getName().getBytes("UTF-8"), "iso-8859-1");response.addHeader("Content-Disposition", "attachment; filename = " + fileNamedoc);fis = new FileInputStream(fileExcel);bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());byte[] buf = new byte[4096];int length = bis.read(buf);//保存文件while(length != -1){bos.write(buf, 0, length);length = bis.read(buf);}bos.flush();bos.close();bis.close();}if(prefix.equals("jpg")){// 读取原图片信息File srcImgFile = new File(path, fileName);Image srcImg = ImageIO.read(srcImgFile);int srcImgWidth = srcImg.getWidth(null);int srcImgHeight = srcImg.getHeight(null);// 加水印BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = bufImg.createGraphics();g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);Font font = new Font("宋体", Font.BOLD, srcImgHeight / 6);//根据图片的背景设置水印颜色g.setColor(Color.GRAY);//设置旋转角度g.rotate(Math.toRadians(-45), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);//设置水印透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.2F));g.setFont(font);int x = (srcImgWidth - getWatermarkLength("测试水印成功", g)) / 2;int y = srcImgHeight / 2;g.drawString("测试水印成功", x, y);g.dispose();// Excel文件生成后存储的位置。File fileExcel = new File("D://ChromeDownLoad//"+srcImgFile.getName());// 输出图片outImgStream = new FileOutputStream(fileExcel);ImageIO.write(bufImg, "jpg", outImgStream);outImgStream.flush();outImgStream.close();// 从存得的目录中取出并下载response.setContentType("application/octet-stream;charset=UTF-8");String fileNamedoc = new String(fileExcel.getName().getBytes("UTF-8"), "iso-8859-1");response.addHeader("Content-Disposition", "attachment; filename = " + fileNamedoc);fis = new FileInputStream(fileExcel);bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());byte[] buf = new byte[4096];int length = bis.read(buf);//保存文件while(length != -1){bos.write(buf, 0, length);length = bis.read(buf);}bos.flush();bos.close();bis.close();}} catch (FileNotFoundException e) {e.printStackTrace();System.out.println("The file not found!");} catch (IOException e) {e.printStackTrace();} finally {if (baos!=null){try {baos.close();} catch (IOException e) {e.printStackTrace();}}if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (document != null) {try {document.close();} catch (Exception e) {e.printStackTrace();}}if (workbook != null) {try {workbook.close();} catch (IOException e) {e.printStackTrace();}}if (slideShow != null) {try {slideShow.close();} catch (IOException e) {e.printStackTrace();}}if (outImgStream != null) {try {outImgStream.close();} catch (IOException e) {e.printStackTrace();}}}}## 以下方法 为一些工具方法可直接嵌入使用/*** 图片添加水印** @param srcImgPath       需要添加水印的图片的路径* @param outImgPath       添加水印后图片输出路径* @param markContentColor 水印文字的颜色* @param waterMarkContent 水印的文字*/public static void setPictureWatermark(String srcImgPath, String outImgPath, Color markContentColor, String waterMarkContent) {FileOutputStream outImgStream = null;try {// 读取原图片信息File srcImgFile = new File(srcImgPath);Image srcImg = ImageIO.read(srcImgFile);int srcImgWidth = srcImg.getWidth(null);int srcImgHeight = srcImg.getHeight(null);// 加水印BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = bufImg.createGraphics();g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);Font font = new Font("宋体", Font.BOLD, srcImgHeight / 6);//根据图片的背景设置水印颜色g.setColor(markContentColor);//设置旋转角度g.rotate(Math.toRadians(-45), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);//设置水印透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.2F));g.setFont(font);int x = (srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;int y = srcImgHeight / 2;g.drawString(waterMarkContent, x, y);g.dispose();// 输出图片outImgStream = new FileOutputStream(outImgPath);ImageIO.write(bufImg, "jpg", outImgStream);outImgStream.flush();outImgStream.close();} catch (Exception e) {e.printStackTrace();} finally {if (outImgStream != null) {try {outImgStream.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 获取水印文字总长度** @param waterMarkContent 水印的文字* @param g* @return 水印文字总长度*/public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());}/*** 获取水印文字图片流** @param text* @return*/private static ByteArrayOutputStream getImage(String text) {ByteArrayOutputStream os = new ByteArrayOutputStream();try {// 导出到字节流BBufferedImage image = createWaterMarkImageBig(text);ImageIO.write(image, "png", os);} catch (IOException e) {e.printStackTrace();}return os;}/*** 根据文字生成水印图片(大号 平铺)** @param text* @return*/public static BufferedImage createWaterMarkImageBig(String text) {Integer width = 1000;Integer height = 800;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象Font font = new Font("宋体", Font.PLAIN, 70);Graphics2D g2d = image.createGraphics();image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g2d.dispose();g2d = image.createGraphics();//设置字体颜色和透明度g2d.setColor(new Color(0, 0, 0, 60));//设置字体g2d.setStroke(new BasicStroke(1));//设置字体类型  加粗 大小g2d.setFont(font);//设置倾斜度g2d.rotate(Math.toRadians(-30), (double) image.getWidth() / 2, (double) image.getHeight() / 2);FontRenderContext context = g2d.getFontRenderContext();Rectangle2D bounds = font.getStringBounds(text, context);double x = (width - bounds.getWidth()) / 2;double y = (height - bounds.getHeight()) / 2;double ascent = -bounds.getY();double baseY = y + ascent;//写入水印文字原定高度过小,所以累计写水印,增加高度g2d.drawString(text, (int) x, (int) baseY);//设置透明度g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));//释放对象g2d.dispose();return image;}/*** 自定义方法插入文本水印并格式水印效果* word*/private static void InsertTextWatermark(Section section){TextWatermark txtWatermark = new TextWatermark();txtWatermark.setText("添加水印成功");txtWatermark.setFontSize(40);txtWatermark.setColor(Color.LIGHT_GRAY);txtWatermark.setLayout(WatermarkLayout.Diagonal);section.getDocument().setWatermark(txtWatermark);}/*** PDF* @param docInfo*/private static void addWater(PdfDocument docInfo,String path){docInfo.addEventHandler(PdfDocumentEvent.END_PAGE, new IEventHandler() {@Overridepublic void handleEvent(Event event) {PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfDocument pdfDoc = docEvent.getDocument();PdfPage page = docEvent.getPage();PdfFont font = null;try {font = PdfFontFactory.createFont(path, PdfEncodings.IDENTITY_H, false);} catch (IOException e) {e.printStackTrace();}PdfCanvas canvas = new PdfCanvas(page);PdfExtGState gs1 = new PdfExtGState();gs1.setFillOpacity(0.10f); // 水印透明度canvas.setExtGState(gs1);new Canvas(canvas, pdfDoc, page.getPageSize()).setFontSize(60).setFont(font).showTextAligned(new Paragraph("添加水印成功"), 298, 421,pdfDoc.getPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);}});}}

另 PDF 添加水印时 需要中文字体 设置 ,我这引入俩个文件 可直接拷贝到 resource 下

需文件 : FZSSJW.TTF
NotoSerifCJKsc.otf

链接:https://pan.baidu.com/s/1XniiJUQHFzlfRxbzNMPDVg
提取码:lgm9

以上就是添加水印的整体实现方法,这种实现可能有些冗余, 还需各位大佬提出宝贵建议,简化方法进行实现。

java下载附件给(pdf、pptx、word、excel、图片)添加水印相关推荐

  1. Python办公自动化(八)|使用Python转换PDF,Word/Excel/PPT/md/HTML都能转

    Word转PDF Word转PDF应该是最常见的需求了,毕竟使用PDF格式可以更方便展示文档,虽然在Word中可以直接导出为PDF格式,但是使用Python可以批量转换,更加高效. 目前在Python ...

  2. iText导出pdf、word、图片

    一.前言  在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示 ...

  3. java实现word,pdf,excel,图片添加水印

    gitee项目地址:https://gitee.com/betelnutandwine/meutilswatermark: java实现pdf,word,excel,ppt,图片加水印 jar地址:s ...

  4. java xpdf 转换成html_java将Word/Excel/PDF文件转换成HTML整理

    项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下: 一.使用Jacob转换Word,Excel为HTML "JACOB一个Java-COM中间件. ...

  5. java 打印jpg、pdf、word

    转自: https://blog.csdn.net/vatxiongxiaohui/article/details/83985896 目录 一.Java的打印简介 二.Java打印实现 2.1 JPG ...

  6. 文末福利|使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!

    往期精选 Python办公自动化|从Word到Excel Python办公自动化|从Excel到Word Python办公自动化|对比文件,光速完成 Python办公自动化|Excel表格,自动更新 ...

  7. 基于java的格式转换,word 转 pdf、word 转图片、office 格式转换、在线文件预览

    一.项目简介 不管你是java程序员.c++程序员,python程序员,在开发项目中肯定遇到过格式转换的问题,如何轻松搞定格式转换的问题呢?当然是百度啦!面向百度编程已经成为当下程序员的日常操作. 基 ...

  8. python把excel变成ppt_【转】使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!

    今天讲的是各位一定会接触到的PDF转换,关于各种格式的文件转换为PDF有很多第三方工具与网站可以实现,但是使用Python的好处不仅可以批量转换,同时一旦脚本写完了以后就可以一键执行,彻底解放双手,那 ...

  9. Python转换PDF,Word/Excel/PPT都能转!

    今天讲的是各位一定会接触到的PDF转换,关于各种格式的文件转换为PDF有很多第三方工具与网站可以实现,但是使用Python的好处不仅可以批量转换,同时一旦脚本写完了以后就可以一键执行,彻底解放双手,那 ...

最新文章

  1. Blender灯光照明与渲染视频教程 Skillshare – Blender: Product rendering for beginners
  2. UNITY录制视屏解决方案 - ShareREC For Unity3D
  3. norminv函数是什么matlab,norminv函数的用法,表示的是什么意思
  4. mysql填写账户远程_如何开启MySQL的远程帐号
  5. LeetCode 2197. 替换数组中的非互质数(栈)
  6. C++多进程并发框架FFLIB
  7. 如何使用Restic Backup Client将数据备份到对象存储服务
  8. 《单细胞生物》教学反思
  9. c语言编写自由落体运动程序,3个C语言程序急求大神编写,再次先谢过了、
  10. Java-抽象类第一篇认识抽象类
  11. 如何使用易媒助手对文章进行原创检测
  12. Simulink飞行动力学教程
  13. java 火星坐标转wgs84_火星坐标、百度坐标、WGS84坐标、墨卡托投影坐标相互转换...
  14. okhttp实现连接池原理
  15. IT行业英语自我介绍必备
  16. 【读论文0628】Does Learning Require Memorization? A Short Tale about a Long Tail∗
  17. 美联储如期加息带动全球金融市场
  18. 目标与计划:仰望星空且脚踏实地
  19. 非常全的 matlab 函数
  20. asp.net报错:ConnectionString 属性尚未初始化

热门文章

  1. 中国(温州)数安港“2022数据智能夏令营”圆满收官!
  2. 人脸性别转换APP有什么?快把这些APP收好
  3. h3c端口聚合实现服务器增加带宽,H3C 交换机链路聚合与服务器 bond0 负载均衡设置...
  4. Mac端解压缩工具推荐,哪款更实用?
  5. 【Android】 android | as | android studio 安装与使用
  6. 2022年全球及中国农业微生物行业头部企业市场占有率及排名调研报告
  7. 王者荣耀微信哪个服务器人多,明明是用微信的比用QQ的多,那为何王者荣耀QQ区人更多?...
  8. 如何用无人机倾斜摄影采集影像,完成实景三维重建?
  9. 出价策略正处于学习期...
  10. Pycharm下运行调试Python项目时,当调试既需要给调试的程序传入命令行参数又需要程序在设置的断点处停下里查看变量时的解决方法