麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

執(zhí)法文書打印的實(shí)現(xiàn)(一)

2019-11-14 22:08:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
執(zhí)法文書打印的實(shí)現(xiàn)(一)

最近公司做質(zhì)檢的執(zhí)法項(xiàng)目,牽涉到執(zhí)法文書的打印。這個(gè)功能實(shí)現(xiàn)的時(shí)候走了不少?gòu)澛罚?jiǎn)單記錄下,以備后用。

甲方的要求比較苛刻:1、打印功能不依賴于客戶pc機(jī)上的Word程序 2、打印功能不依賴于特定的瀏覽器插件 3、不依賴于其他商業(yè)程序。 這樣,我只能通過(guò)調(diào)用IE內(nèi)置的IEWebBrowser控件進(jìn)行打印。大部分文書可以調(diào)整顯示樣式,來(lái)達(dá)到標(biāo)準(zhǔn)文書的要求,而一些比較特殊的文書如《現(xiàn)場(chǎng)檢查筆錄》,由于嵌套富文本,前臺(tái)很難實(shí)現(xiàn)標(biāo)準(zhǔn)文書的打印效果。這類特殊文書的打印,我的思路是服務(wù)器生成打印圖片,前臺(tái)調(diào)用打印組件打印。

打印圖片的生成主要分為3步:1、根據(jù)word模板填充數(shù)據(jù),生成新的word文件 2、word轉(zhuǎn)pdf 3、pdf轉(zhuǎn)圖片

生成word主要有兩種方法:1、poi生成word(本例中使用的方法) 2、使用freemarker生成word

照例先copy下poi項(xiàng)目介紹:POI項(xiàng)目的使命是創(chuàng)建和維護(hù)java api操縱各種文件格式 基于Office Open xml標(biāo)準(zhǔn)(OOXML)和微軟的OLE 2復(fù)合文檔格式(OLE2)。 簡(jiǎn)而言之,您可以使用Java讀寫MS Excel文件。其中,HWPF提供對(duì)word97的支持,XWPF提供對(duì)word2007(ooxml國(guó)際標(biāo)準(zhǔn))的支持。

首先,參照官方代碼寫了測(cè)試方法:

文本替換測(cè)試:

@Test    public void testPoi() {        try {            //docx文件的文檔對(duì)象            XWPFDocument xwpfDocument=new XWPFDocument(POIXMLDocument.openPackage("D:/testPoi.docx"));            //XWPFParagraph 包含在文檔/表格/標(biāo)題中的段落(段落中包含很多樣式信息)            //需求:替換段落中的文本/圖片等,不涉及新加段落            //遍歷文檔的段落對(duì)象(不包括頁(yè)眉頁(yè)腳)            for (XWPFParagraph xwpfParagraph : xwpfDocument.getParagraphs()) {                //XWPFRun對(duì)象定義了文本區(qū)域的一組公共的屬性                for (XWPFRun xwpfRun : xwpfParagraph.getRuns()) {                    //文本替換                    if("${營(yíng)業(yè)執(zhí)照}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                        //{1}                        xwpfRun.setColor("FF0000");//設(shè)置文本顏色                        xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照",0);//文本替換                        //xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照1",-1); //在當(dāng)前文本后追加文本                        //xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照12",2); //在當(dāng)前文本后追加文本                        //xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照11",1); //在“我的營(yíng)業(yè)執(zhí)照1”后追加文本                    }                    //圖片替換添加                    if("${二維碼}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                        //{2}                        xwpfRun.setText("",0);//文本替換                        //在文檔中插入圖片失敗                        //xwpfParagraph.createRun().addPicture(new FileInputStream(new File("D:/二維碼.PNG")), Document.PICTURE_TYPE_PNG, "二維碼", Units.toEMU(200), Units.toEMU(200));                        //xwpfRun.addPicture(new FileInputStream(new File("D:/二維碼.PNG")), Document.PICTURE_TYPE_PNG, "二維碼", Units.toEMU(200), Units.toEMU(200));                        //create run需要結(jié)束當(dāng)前循環(huán)                        //break;                    }                }            }            //文檔create 添加圖片失敗            //xwpfDocument.createParagraph().createRun().addPicture(new FileInputStream(new File("D:/二維碼.PNG")), Document.PICTURE_TYPE_PNG, "二維碼", Units.toEMU(200), Units.toEMU(200));            FileOutputStream fos = new FileOutputStream(new File("D:/testPoi1.docx"));            xwpfDocument.write(fos);            fos.flush();            fos.close();        } catch (IOException e) {            System.out.文本替換

比較坑的是word中寫的標(biāo)記會(huì)被ms解析成不同的run,需要自行修改:

應(yīng)為:

Poi添加圖片的方法存在bug,官方暫時(shí)還沒有修復(fù):

執(zhí)行添加圖片方法后,打不開文檔:

文檔插入圖片bug修復(fù)并測(cè)試:

新建類:CustomXWPFDocument繼承XWPFDocument

  添加方法:createPic

  

 public void createPic(String blipId,int id, int width, int height,CTInline inline) {         final int EMU = 9525;         width *= EMU;         height *= EMU;         //String blipId = getAllPictures().get(id).getPackageRelationship().getId();         //CTInline inline = createParagraph().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=/"" + id + "/" 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>";         //CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData();         XmlToken xmlToken = null;         try         {             xmlToken = XmlToken.Factory.parse(picXml);         }         catch(XmlException xe)         {             xe.printStackTrace();         }         inline.set(xmlToken);         //graphicData.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(id);         docPr.setName("Picture " + id);         docPr.setDescr("Generated");    }
CustomXWPFDocument

    @Test    public void testPoi1() {        try {            //docx文件的文檔對(duì)象            CustomXWPFDocument xwpfDocument=new CustomXWPFDocument(POIXMLDocument.openPackage("D:/testPoi.docx"));            //遍歷頁(yè)眉頁(yè)腳            for (XWPFHeaderFooter xwpfhf : xwpfDocument.getHeaderList()) {                //這部分可以作為方法提取出來(lái)                for (XWPFParagraph xwpfParagraph : xwpfhf.getParagraphs()) {                    for (XWPFRun xwpfRun : xwpfParagraph.getRuns()) {                        //圖片替換添加  在頁(yè)眉上添加圖片沒有實(shí)現(xiàn)                        if("${二維碼}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                            //{2}                            //添加圖片前,設(shè)置段落行角色為    自動(dòng)                            xwpfParagraph.setSpacingLineRule(LineSpacingRule.AUTO);                            CTInline ctinline=xwpfRun.getCTR().addNewDrawing().addNewInline();                            String id = xwpfDocument.addPictureData(new FileInputStream(new File("D://erweima.jpg")), Document.PICTURE_TYPE_JPEG);                            int id2=xwpfDocument.getAllPackagePictures().size()+111;                            xwpfDocument.createPic(id,id2, 259, 259,ctinline);                        }                    }                }            }            //XWPFParagraph 包含在文檔/表格/標(biāo)題中的段落(段落中包含很多樣式信息)            //需求:替換段落中的文本/圖片等,不涉及新加段落            //遍歷文檔的段落對(duì)象(不包括頁(yè)眉頁(yè)腳)            for (XWPFParagraph xwpfParagraph : xwpfDocument.getParagraphs()) {                //XWPFRun對(duì)象定義了文本區(qū)域的一組公共的屬性                for (XWPFRun xwpfRun : xwpfParagraph.getRuns()) {                    //文本替換                    if("${營(yíng)業(yè)執(zhí)照}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                        //{1}                        xwpfRun.setColor("FF0000");//設(shè)置文本顏色                        xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照",0);//文本替換                        //xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照1",-1); //在當(dāng)前文本后追加文本                        //xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照12",2); //在當(dāng)前文本后追加文本                        //xwpfRun.setText("我的營(yíng)業(yè)執(zhí)照11",1); //在“我的營(yíng)業(yè)執(zhí)照1”后追加文本                    }                    //圖片替換添加                    if("${二維碼}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                        //{2}                        //添加圖片前,設(shè)置段落行角色為    自動(dòng)                        xwpfParagraph.setSpacingLineRule(LineSpacingRule.AUTO);                        CTInline ctinline=xwpfRun.getCTR().addNewDrawing().addNewInline();                        String id = xwpfDocument.addPictureData(new FileInputStream(new File("D://二維碼.PNG")), Document.PICTURE_TYPE_JPEG);                        int id2=xwpfDocument.getAllPackagePictures().size()+1;                        xwpfDocument.createPic(id,id2, 259, 259,ctinline);                    }                }            }            //文檔create 添加圖片失敗            //xwpfDocument.createParagraph().createRun().addPicture(new FileInputStream(new File("D:/二維碼.PNG")), Document.PICTURE_TYPE_PNG, "二維碼", Units.toEMU(200), Units.toEMU(200));            FileOutputStream fos = new FileOutputStream(new File("D:/testPoi1.docx"));            xwpfDocument.write(fos);            fos.flush();            fos.close();        } catch (IOException e) {            System.out.println("加載文件失敗");            e.printStackTrace();        } catch (Exception e) {            System.out.println("序列化圖片失敗");            e.printStackTrace();        }    }
添加圖片測(cè)試

圖片添加經(jīng)常出現(xiàn)如圖的效果:

這是圖片空間不足引起的,在document.xml中查看是:

<w:spacing w:line="500" w:lineRule="exact"/>

所以設(shè)計(jì)模板時(shí)或者在代碼中修改為 w:lineRule='auto'即可

測(cè)試代碼和word文件:http://yunpan.cn/cfKAtVfakJQpN(提取碼:31a0)

注:頁(yè)眉頁(yè)腳中添加/替換圖片都沒有實(shí)現(xiàn),求探討指教

注:4/5年沒寫過(guò)文章了,特別生疏,勿怪

注:做的時(shí)候出現(xiàn)不少錯(cuò)誤,待添加

另外,freemarker的實(shí)現(xiàn)會(huì)放在下一篇中。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 色戒在线版| 主播粉嫩国产在线精品 | 香蕉成人在线观看 | 日韩一级免费毛片 | 精品无码一区在线观看 | 香蕉视频1024 | 一区二区三区日韩 | 成人免费看视频 | 国产在线免费 | 99re久久最新地址获取 | 亚洲网站一区 | 妇女毛片| 久久免费视屏 | 亚洲国产馆 | 亚洲va久久久噜噜噜久牛牛影视 | 日韩av日韩 | 久久久鲁 | 欧美亚洲黄色片 | 国产免费视频在线 | 亚洲免费在线看 | 国产精品成人一区二区三区吃奶 | 亚洲免费观看视频 | 欧美a在线观看 | 日本精品久久久久久草草 | 色交视频 | 亚洲人成电影在线 | 久久欧美亚洲另类专区91大神 | 新久久久久久 | 国产精品美女久久久久久不卡 | 欧美日韩在线视频一区 | 在线观看国产一区二区 | 毛片在哪看 | 美女被免费网站在线软件 | 亚洲一区成人在线 | 久久羞羞 | 国产亚洲精品综合一区91 | 国产精品国产三级国产在线观看 | 久久国产精品小视频 | 毛片在线免费播放 | 亚洲性视频 | 成人午夜天堂 |