package cn.cslg.pas.service; import cn.cslg.pas.common.model.vo.PoiVO; import cn.cslg.pas.domain.PatentPledge; import cn.cslg.pas.mapper.PatentPledgeMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.util.LocaleUtil; import org.apache.poi.util.Units; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.*; import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; /** *

* 专利信息质押质权人表 服务类 *

* * @author 王岩 * @since 2022-02-24 */ @Service @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class PoiService extends ServiceImpl { public PoiVO readWordFile() throws IOException { PoiVO poiVO = new PoiVO(); List pgs = new ArrayList<>(); InputStream is = new FileInputStream("C:\\\\BaiduNetdiskDownload\\\\生成\\\\first.docx"); XWPFDocument doc = new XWPFDocument(is); List bodyElements = doc.getBodyElements(); for (IBodyElement iBodyElement : bodyElements) { PoiVO.Pg pg = new PoiVO.Pg(); if (iBodyElement.getElementType().name().equals("PARAGRAPH")) { XWPFParagraph paragraph = (XWPFParagraph) iBodyElement; if (paragraph.getStyle() != null && paragraph.getStyle().equals("word")) { XWPFRun rh = paragraph.getRuns().get(0); pg.setFontSize(rh.getFontSize()); pg.setFontFamily(rh.getFontFamily()); pg.setText(rh.getText(0)); pg.setColor(rh.getColor()); pg.setAlignment(paragraph.getFontAlignment()); pg.setType(paragraph.getStyle()); pgs.add(pg); } else if (paragraph.getStyle() != null && paragraph.getStyle().equals("picture")) { XWPFRun rh = paragraph.getRuns().get(0); pg.setAlignment(paragraph.getFontAlignment()); pg.setType(paragraph.getStyle()); XWPFPicture picture = rh.getEmbeddedPictures().get(0); pg.setHeight((int) picture.getDepth()); pg.setWeight((int) picture.getWidth()); pg.setImgUrl(picture.getDescription()); pgs.add(pg); } else if (paragraph.getStyle() != null && paragraph.getStyle().contains("Heading")) { XWPFRun rh = paragraph.getRuns().get(0); pg.setFontSize(rh.getFontSize()); pg.setFontFamily(rh.getFontFamily()); pg.setText(rh.getText(0)); pg.setColor(rh.getColor()); pg.setAlignment(paragraph.getFontAlignment()); pg.setType(paragraph.getStyle()); pgs.add(pg); } } else if (iBodyElement.getElementType().name().equals("TABLE")) { XWPFTable table = (XWPFTable) iBodyElement; String org = table.getText().replace("\t", ",").replace("\n", "||"); String tableText = org.replace(",||", ""); pg.setText(tableText); pg.setType(table.getStyleID()); pgs.add(pg); } } List ps = doc.getParagraphs(); PoiVO.Pg title = new PoiVO.Pg(); title.setAlignment(ps.get(0).getFontAlignment()); XWPFRun r = ps.get(0).getRuns().get(0); title.setColor(r.getColor()); title.setText(r.getText(0)); title.setFontSize(r.getFontSize()); poiVO.setPgs(pgs); poiVO.setTitle(title); return poiVO; } public void writeFile(PoiVO poiVO) throws IOException, InvalidFormatException { XWPFDocument doc = new XWPFDocument();// 创建Word文件 PoiVO.Pg title = poiVO.getTitle(); // 标题 XWPFParagraph p = doc.createParagraph();// 新建段落 p.setFontAlignment(title.getAlignment());// 设置段落的对齐方式 XWPFRun r = p.createRun();//创建标题 r.setText(title.getText()); r.setBold(title.getBold());//设置为粗体 r.setColor(title.getColor());//设置颜色 r.setFontSize(title.getFontSize());//设置字体大小 r.setStyle("Title"); if (title.getAddCarriageReturn()) { r.addCarriageReturn();//回车换行 } doc.createParagraph().createRun().addBreak(BreakType.PAGE);//换页 List pgs = poiVO.getPgs(); CTSdtBlock ctSdtBlock = doc.getDocument().getBody().addNewSdt(); this.CustomTOC(ctSdtBlock); doc.createParagraph().createRun().addBreak(BreakType.PAGE);//换页 for (int i = 0; i < pgs.size(); i++) { if (pgs.get(i).getType() != null && pgs.get(i).getType().equals("word")) { XWPFParagraph tm = doc.createParagraph(); tm.setStyle("word"); XWPFRun rh = tm.createRun(); rh.setFontSize(pgs.get(i).getFontSize()); rh.setFontFamily(pgs.get(i).getFontFamily()); rh.setText(pgs.get(i).getText()); rh.setColor(pgs.get(i).getColor()); tm.setFontAlignment(pgs.get(i).getAlignment()); rh.setFontFamily(pgs.get(i).getFontFamily()); if (pgs.get(i).getAddCarriageReturn()) { rh.addCarriageReturn();//回车换行 } } else if (pgs.get(i).getType() != null && pgs.get(i).getType().equals("picture")) { XWPFParagraph pImg = doc.createParagraph(); pImg.setStyle("picture"); pImg.setFontAlignment(pgs.get(i).getAlignment()); XWPFRun rImg = pImg.createRun();//创建标题 rImg.addCarriageReturn();//回车换行 String imgData = pgs.get(i).getImgUrl(); // 转为数据流 InputStream stream = new FileInputStream(imgData); // 向段落中插入图片 rImg.addPicture(stream, Document.PICTURE_TYPE_PNG, pgs.get(i).getImgUrl(), Units.toEMU(pgs.get(i).getWeight()), Units.toEMU(pgs.get(i).getHeight())); } else if (pgs.get(i).getType() != null && pgs.get(i).getType().equals("table")) { String org = pgs.get(i).getText(); int rows; int cols = 0; String[] row = org.split("\\|\\|"); rows = row.length; for (String s : row) { String[] tem = s.split(","); cols = Math.max(cols, tem.length); } XWPFTable table1 = doc.createTable(rows, cols); table1.setStyleID(pgs.get(i).getType()); table1.setWidthType(TableWidthType.AUTO); for (int t = 0; t < row.length; t++) { String[] tem = row[t].split(","); XWPFTableRow row1 = table1.getRow(t); for (int q = 0; q < tem.length; q++) { row1.getCell(q).setText(tem[q]); } } doc.setTable(0, table1); } else if (pgs.get(i).getType().contains("Heading")) { XWPFParagraph Paragraph = doc.createParagraph(); CTBookmark ctBookmark1 = Paragraph.getCTP().addNewBookmarkStart();//开始书签 ctBookmark1.setId(BigInteger.valueOf(i));//开始书签和结束书签通过ID关联 ctBookmark1.setName("书签" + i);//书签名称 Paragraph.setStyle(pgs.get(i).getType()); XWPFRun run1 = Paragraph.createRun(); run1.setText(pgs.get(i).getText()); run1.setColor(pgs.get(i).getColor()); run1.setFontSize(pgs.get(i).getFontSize()); run1.setBold(true); Paragraph.getCTP().addNewBookmarkEnd().setId(BigInteger.valueOf(i)); } } this.addItem2TOC(doc, ctSdtBlock); Integer pageCount = doc.getProperties().getExtendedProperties().getUnderlyingProperties().getPages(); FileOutputStream out = new FileOutputStream("C:\\\\BaiduNetdiskDownload\\\\生成\\\\first.docx"); CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr(); XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(doc, sectPr); // this.createDefaultFooter(doc,"宋体",8); // 添加页脚, CTP ctpFooter = CTP.Factory.newInstance(); CTR ctrFooter = ctpFooter.addNewR(); CTText ctFooter = ctrFooter.addNewT(); String footerText = "ctpFooter"; ctFooter.setStringValue(footerText); XWPFParagraph footerParagraph = new XWPFParagraph(ctpFooter, doc); XWPFParagraph[] parsFooter = new XWPFParagraph[1]; parsFooter[0] = footerParagraph; policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, parsFooter); doc.write(out); out.close(); System.out.println("Process Completed Successfully"); } public void addItem2TOC(XWPFDocument doc, CTSdtBlock block) { List paragraphs = doc.getParagraphs(); int num = 1; for (XWPFParagraph par : paragraphs) { String parStyle = par.getStyle(); List ctrlist = par.getCTP().getRList();//获取标签下的list for (CTR r : ctrlist) { //遍历r List breaklist = r.getLastRenderedPageBreakList();//判断是否存在此标签 if (breaklist.size() > 0) { num++; //页数添加 } } if (parStyle != null && parStyle.startsWith("Heading")) { List bookmarkList = par.getCTP().getBookmarkStartList(); try { int level = Integer.parseInt(parStyle.substring("Heading".length())); //添加标题 this.addRow(level, par.getText(), num, bookmarkList.get(0).getName(), block); } catch (NumberFormatException e) { e.printStackTrace(); } } } } //生成页脚 public static void createDefaultFooter(final XWPFDocument document, String fontName, int fontSize) throws IOException { CTP pageNo = CTP.Factory.newInstance(); XWPFParagraph footer = new XWPFParagraph(pageNo, document); footer.createRun().setFontSize(2000); CTPPr begin = pageNo.addNewPPr(); begin.addNewPStyle().setVal("style21"); begin.addNewJc().setVal(STJc.CENTER); CTR pageBegin = pageNo.addNewR(); pageBegin.addNewRPr().addNewRFonts().setAscii(fontName); pageBegin.addNewRPr().addNewRFonts().setCs(fontName); pageBegin.addNewRPr().addNewRFonts().setEastAsia(fontName); pageBegin.addNewRPr().addNewRFonts().setHAnsi(fontName); pageBegin.addNewRPr().addNewSz().setVal(BigInteger.valueOf(fontSize)); pageBegin.addNewRPr().addNewSzCs().setVal(BigInteger.valueOf(fontSize)); pageBegin.addNewFldChar().setFldCharType(STFldCharType.BEGIN); CTR page = pageNo.addNewR(); page.addNewRPr().addNewRFonts().setAscii(fontName); page.addNewRPr().addNewRFonts().setCs(fontName); page.addNewRPr().addNewRFonts().setEastAsia(fontName); page.addNewRPr().addNewRFonts().setHAnsi(fontName); page.addNewRPr().addNewSz().setVal(BigInteger.valueOf(fontSize)); page.addNewRPr().addNewSzCs().setVal(BigInteger.valueOf(fontSize)); page.addNewInstrText().setStringValue("PAGE \\* MERGEFORMAT"); CTR pageSep = pageNo.addNewR(); pageSep.addNewRPr().addNewRFonts().setAscii(fontName); pageSep.addNewRPr().addNewRFonts().setCs(fontName); pageSep.addNewRPr().addNewRFonts().setEastAsia(fontName); pageSep.addNewRPr().addNewRFonts().setHAnsi(fontName); pageSep.addNewRPr().addNewSz().setVal(BigInteger.valueOf(fontSize)); pageSep.addNewRPr().addNewSzCs().setVal(BigInteger.valueOf(fontSize)); pageSep.addNewFldChar().setFldCharType(STFldCharType.SEPARATE); CTR end = pageNo.addNewR(); CTRPr endRPr = end.addNewRPr(); endRPr.addNewNoProof(); endRPr.addNewLang().setVal("zh-CN"); end.addNewRPr().addNewRFonts().setAscii(fontName); end.addNewRPr().addNewRFonts().setCs(fontName); end.addNewRPr().addNewRFonts().setEastAsia(fontName); end.addNewRPr().addNewRFonts().setHAnsi(fontName); end.addNewRPr().addNewSz().setVal(BigInteger.valueOf(fontSize)); end.addNewRPr().addNewSzCs().setVal(BigInteger.valueOf(fontSize)); end.addNewFldChar().setFldCharType(STFldCharType.END); CTSectPr sectPr = document.getDocument().getBody().isSetSectPr() ? document.getDocument().getBody().getSectPr() : document.getDocument().getBody().addNewSectPr(); XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(document, sectPr); policy.createFooter(STHdrFtr.DEFAULT, new XWPFParagraph[]{footer}); } // 目录添加行 public void addRow(int level, String title, int page, String bookmarkRef, CTSdtBlock block) { CTSdtContentBlock contentBlock = block.getSdtContent(); CTP p = contentBlock.addNewP(); p.setRsidR("00EF7E24".getBytes(LocaleUtil.CHARSET_1252)); p.setRsidRDefault("00EF7E24".getBytes(LocaleUtil.CHARSET_1252)); CTPPr pPr = p.addNewPPr(); pPr.addNewPStyle().setVal("TOC" + level); CTTabs tabs = pPr.addNewTabs();//Set of Custom Tab Stops自定义制表符集合 CTTabStop tab = tabs.addNewTab();//Custom Tab Stop自定义制表符 tab.setVal(STTabJc.RIGHT); tab.setLeader(STTabTlc.DOT); tab.setPos(new BigInteger("9100"));//默认为8290,因为调整过页边距,所有需要调整,手动设置找出最佳值 pPr.addNewRPr().addNewNoProof();//不检查语法 CTR run = p.addNewR(); run.addNewRPr().addNewNoProof(); for (int i = 0; i < level; i++) { title = "\n" + title; } run.addNewT().setStringValue(title);//添加标题文字 //设置标题字体 CTRPr pRpr = run.getRPr(); CTFonts fonts = pRpr.isSetRFonts() ? pRpr.getRFonts() : pRpr.addNewRFonts(); fonts.setAscii("Times New Roman"); fonts.setEastAsia("楷体"); fonts.setHAnsi("楷体"); // 设置标题字体大小 CTHpsMeasure sz = pRpr.isSetSz() ? pRpr.getSz() : pRpr.addNewSz(); sz.setVal(new BigInteger("21")); CTHpsMeasure szCs = pRpr.isSetSzCs() ? pRpr.getSzCs() : pRpr.addNewSzCs(); szCs.setVal(new BigInteger("21")); //添加制表符 run = p.addNewR(); run.addNewRPr().addNewNoProof(); run.addNewTab(); //添加页码左括号 p.addNewR().addNewT().setStringValue("("); //STFldCharType.BEGIN标识与结尾处STFldCharType.END相对应 run = p.addNewR(); run.addNewRPr().addNewNoProof(); run.addNewFldChar().setFldCharType(STFldCharType.BEGIN);//Field Character Type // pageref run run = p.addNewR(); run.addNewRPr().addNewNoProof(); CTText text = run.addNewInstrText();//Field Code 添加域代码文本控件 text.setSpace(SpaceAttribute.Space.PRESERVE); // bookmark reference //源码的域名为" PAGEREF _Toc","\h"含义为在目录内建立目录项与页码的超链接 text.setStringValue(" PAGEREF " + bookmarkRef + " \\h "); p.addNewR().addNewRPr().addNewNoProof(); run = p.addNewR(); run.addNewRPr().addNewNoProof(); run.addNewFldChar().setFldCharType(STFldCharType.SEPARATE); // page number run run = p.addNewR(); run.addNewRPr().addNewNoProof(); run.addNewT().setStringValue(Integer.toString(page)); run = p.addNewR(); run.addNewRPr().addNewNoProof(); //STFldCharType.END标识与上面STFldCharType.BEGIN相对应 run.addNewFldChar().setFldCharType(STFldCharType.END); //添加页码右括号 p.addNewR().addNewT().setStringValue(")"); //设置行间距 CTSpacing pSpacing = pPr.getSpacing() != null ? pPr.getSpacing() : pPr.addNewSpacing(); pSpacing.setLineRule(STLineSpacingRule.AUTO);//行间距类型:多倍 pSpacing.setLine(new BigInteger("360"));//此处1.5倍行间距 } //添加目录 public void CustomTOC(CTSdtBlock block) { CTSdtPr sdtPr = block.addNewSdtPr(); CTDecimalNumber id = sdtPr.addNewId(); id.setVal(new BigInteger("4844945")); sdtPr.addNewDocPartObj().addNewDocPartGallery().setVal("Table of contents"); CTSdtEndPr sdtEndPr = block.addNewSdtEndPr(); CTRPr rPr = sdtEndPr.addNewRPr(); CTFonts fonts = rPr.addNewRFonts(); fonts.setAsciiTheme(STTheme.MINOR_H_ANSI); fonts.setEastAsiaTheme(STTheme.MINOR_H_ANSI); fonts.setHAnsiTheme(STTheme.MINOR_H_ANSI); fonts.setCstheme(STTheme.MINOR_BIDI); rPr.addNewB().setVal(STOnOff.OFF); rPr.addNewBCs().setVal(STOnOff.OFF); rPr.addNewColor().setVal("auto"); rPr.addNewSz().setVal(new BigInteger("24")); rPr.addNewSzCs().setVal(new BigInteger("24")); CTSdtContentBlock content = block.addNewSdtContent(); CTP p = content.addNewP(); p.setRsidR("00EF7E24".getBytes(LocaleUtil.CHARSET_1252)); p.setRsidRDefault("00EF7E24".getBytes(LocaleUtil.CHARSET_1252)); p.addNewPPr().addNewPStyle().setVal("TOCHeading"); p.addNewR().addNewT().setStringValue("目 录");//源码中为"Table of contents" //设置段落对齐方式,即将“目录”二字居中 CTPPr pr = p.getPPr(); CTJc jc = pr.isSetJc() ? pr.getJc() : pr.addNewJc(); STJc.Enum en = STJc.Enum.forInt(ParagraphAlignment.CENTER.getValue()); jc.setVal(en); //"目录"二字的字体 CTRPr pRpr = p.getRArray(0).addNewRPr(); fonts = pRpr.isSetRFonts() ? pRpr.getRFonts() : pRpr.addNewRFonts(); fonts.setAscii("Times New Roman"); fonts.setEastAsia("华文中宋"); fonts.setHAnsi("华文中宋"); //"目录"二字加粗 CTOnOff bold = pRpr.isSetB() ? pRpr.getB() : pRpr.addNewB(); bold.setVal(STOnOff.TRUE); // 设置“目录”二字字体大小为24号 CTHpsMeasure sz = pRpr.isSetSz() ? pRpr.getSz() : pRpr.addNewSz(); sz.setVal(new BigInteger("36")); } }