亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

執法文書打印的實現(一)

2019-11-14 22:08:15
字體:
來源:轉載
供稿:網友
執法文書打印的實現(一)

最近公司做質檢的執法項目,牽涉到執法文書的打印。這個功能實現的時候走了不少彎路,簡單記錄下,以備后用。

甲方的要求比較苛刻:1、打印功能不依賴于客戶pc機上的Word程序 2、打印功能不依賴于特定的瀏覽器插件 3、不依賴于其他商業程序。 這樣,我只能通過調用IE內置的IEWebBrowser控件進行打印。大部分文書可以調整顯示樣式,來達到標準文書的要求,而一些比較特殊的文書如《現場檢查筆錄》,由于嵌套富文本,前臺很難實現標準文書的打印效果。這類特殊文書的打印,我的思路是服務器生成打印圖片,前臺調用打印組件打印。

打印圖片的生成主要分為3步:1、根據word模板填充數據,生成新的word文件 2、word轉pdf 3、pdf轉圖片

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

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

首先,參照官方代碼寫了測試方法:

文本替換測試:

@Test    public void testPoi() {        try {            //docx文件的文檔對象            XWPFDocument xwpfDocument=new XWPFDocument(POIXMLDocument.openPackage("D:/testPoi.docx"));            //XWPFParagraph 包含在文檔/表格/標題中的段落(段落中包含很多樣式信息)            //需求:替換段落中的文本/圖片等,不涉及新加段落            //遍歷文檔的段落對象(不包括頁眉頁腳)            for (XWPFParagraph xwpfParagraph : xwpfDocument.getParagraphs()) {                //XWPFRun對象定義了文本區域的一組公共的屬性                for (XWPFRun xwpfRun : xwpfParagraph.getRuns()) {                    //文本替換                    if("${營業執照}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                        //{1}                        xwpfRun.setColor("FF0000");//設置文本顏色                        xwpfRun.setText("我的營業執照",0);//文本替換                        //xwpfRun.setText("我的營業執照1",-1); //在當前文本后追加文本                        //xwpfRun.setText("我的營業執照12",2); //在當前文本后追加文本                        //xwpfRun.setText("我的營業執照11",1); //在“我的營業執照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需要結束當前循環                        //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中寫的標記會被ms解析成不同的run,需要自行修改:

應為:

Poi添加圖片的方法存在bug,官方暫時還沒有修復:

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

文檔插入圖片bug修復并測試:

新建類: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文件的文檔對象            CustomXWPFDocument xwpfDocument=new CustomXWPFDocument(POIXMLDocument.openPackage("D:/testPoi.docx"));            //遍歷頁眉頁腳            for (XWPFHeaderFooter xwpfhf : xwpfDocument.getHeaderList()) {                //這部分可以作為方法提取出來                for (XWPFParagraph xwpfParagraph : xwpfhf.getParagraphs()) {                    for (XWPFRun xwpfRun : xwpfParagraph.getRuns()) {                        //圖片替換添加  在頁眉上添加圖片沒有實現                        if("${二維碼}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                            //{2}                            //添加圖片前,設置段落行角色為    自動                            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 包含在文檔/表格/標題中的段落(段落中包含很多樣式信息)            //需求:替換段落中的文本/圖片等,不涉及新加段落            //遍歷文檔的段落對象(不包括頁眉頁腳)            for (XWPFParagraph xwpfParagraph : xwpfDocument.getParagraphs()) {                //XWPFRun對象定義了文本區域的一組公共的屬性                for (XWPFRun xwpfRun : xwpfParagraph.getRuns()) {                    //文本替換                    if("${營業執照}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                        //{1}                        xwpfRun.setColor("FF0000");//設置文本顏色                        xwpfRun.setText("我的營業執照",0);//文本替換                        //xwpfRun.setText("我的營業執照1",-1); //在當前文本后追加文本                        //xwpfRun.setText("我的營業執照12",2); //在當前文本后追加文本                        //xwpfRun.setText("我的營業執照11",1); //在“我的營業執照1”后追加文本                    }                    //圖片替換添加                    if("${二維碼}".equalsIgnoreCase(xwpfRun.getText(xwpfRun.getTextPosition()))){                        //{2}                        //添加圖片前,設置段落行角色為    自動                        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();        }    }
添加圖片測試

圖片添加經常出現如圖的效果:

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

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

所以設計模板時或者在代碼中修改為 w:lineRule='auto'即可

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

注:頁眉頁腳中添加/替換圖片都沒有實現,求探討指教

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

注:做的時候出現不少錯誤,待添加

另外,freemarker的實現會放在下一篇中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产99国产精品澳门| 日韩久久免费电影| 色无极亚洲影院| 亚洲国产成人av在线| 国产精品久久久999| 亚洲伊人第一页| 国产极品精品在线观看| 青青草精品毛片| 日韩成人中文电影| 国产一区二区三区18| 麻豆成人在线看| 亚洲欧美中文字幕在线一区| 51精品国产黑色丝袜高跟鞋| 在线亚洲国产精品网| 国产精品最新在线观看| 韩剧1988在线观看免费完整版| 色噜噜狠狠狠综合曰曰曰88av| 亚洲国产精品va在看黑人| 国产成人精品999| 欧美电影电视剧在线观看| 亚洲最大中文字幕| 久久网福利资源网站| 国产精品网站大全| 亚洲第一精品福利| 日韩中文理论片| 91在线无精精品一区二区| 亚洲香蕉av在线一区二区三区| 亚洲最大中文字幕| 国外色69视频在线观看| 日韩精品亚洲精品| 清纯唯美日韩制服另类| 国产精品久久久av久久久| 国内精品久久久久| 亚洲国产欧美一区二区三区同亚洲| 亚洲激情视频在线观看| 久久亚洲综合国产精品99麻豆精品福利| 久久91亚洲精品中文字幕| 欧美激情亚洲自拍| 亚洲欧洲偷拍精品| 欧美尺度大的性做爰视频| 久久中文字幕一区| 日韩一二三在线视频播| 国产成人一区二区| 欧美激情在线播放| 青草青草久热精品视频在线网站| 伊人久久久久久久久久| 亚洲丝袜在线视频| 91免费福利视频| 亚洲欧美日韩国产成人| 视频在线观看99| 国产日韩欧美电影在线观看| 日韩电影在线观看永久视频免费网站| 久久精品美女视频网站| 日韩精品在线播放| 成人xxxx视频| 亚洲国产私拍精品国模在线观看| 欧美精品18videosex性欧美| 欧美做受高潮1| 97在线精品视频| 国产精品丝袜高跟| 91啪国产在线| 欧美体内谢she精2性欧美| www.精品av.com| 久久久久免费视频| 亚洲自拍偷拍色片视频| 国模叶桐国产精品一区| 久久久久久久久久久国产| 北条麻妃一区二区三区中文字幕| 国产精品美女久久久久久免费| 色综合伊人色综合网站| 久久久久久尹人网香蕉| 成人伊人精品色xxxx视频| 日本精品久久中文字幕佐佐木| 日本精品久久电影| 久久噜噜噜精品国产亚洲综合| 97免费在线视频| 日韩av影视综合网| 久久久在线免费观看| 成人性教育视频在线观看| 欧美日韩一区二区三区在线免费观看| 国产日韩欧美在线视频观看| 亚洲国产成人久久综合一区| 日韩精品中文字幕久久臀| 亚洲999一在线观看www| 亚洲第一精品福利| 91高清免费在线观看| 国产精品久久久久久久久久新婚| 亚洲精品久久久久久久久久久久| 国产亚洲精品久久久久久牛牛| 亚洲激情久久久| 大伊人狠狠躁夜夜躁av一区| 日韩av在线免费看| 国产精品视频久久| 国产免费观看久久黄| 丝袜美腿亚洲一区二区| 日av在线播放中文不卡| 久久av红桃一区二区小说| 97国产精品视频人人做人人爱| 国产视频久久久久久久| 国产91亚洲精品| 国产精品偷伦免费视频观看的| 亚洲二区在线播放视频| 精品国产欧美一区二区五十路| 欧美亚洲另类制服自拍| 色先锋久久影院av| 欧美另类极品videosbestfree| 中文字幕亚洲欧美| 日韩精品亚洲视频| 中文字幕综合在线| 日韩欧美精品中文字幕| 国产精品久久久久久久久影视| 欧美裸体视频网站| 亚洲人成五月天| 欧美与黑人午夜性猛交久久久| 久久久欧美精品| 日韩亚洲精品视频| 91免费高清视频| 亚洲国产精品一区二区三区| 性欧美视频videos6一9| 国产aaa精品| 日韩中文字幕在线视频播放| 国产精品女主播| 欧美一级高清免费播放| 国产亚洲欧美日韩一区二区| 亚洲一区二区三区四区视频| 国产亚洲精品成人av久久ww| 综合国产在线视频| 色偷偷综合社区| 97视频在线观看亚洲| 国产精品对白刺激| 乱亲女秽乱长久久久| 国产精品久久久久9999| 欧美激情综合亚洲一二区| 国产精品日韩一区| 国产精品一区二区在线| 97色在线观看免费视频| 亚洲成人激情小说| 国产成人精品视频在线| 成人高清视频观看www| 欧美国产高跟鞋裸体秀xxxhd| 亚洲最大福利网| 国产一区在线播放| 亚洲一区免费网站| 91欧美精品午夜性色福利在线| 亚洲精品黄网在线观看| 久久久久久久av| 青青草精品毛片| 中文国产成人精品久久一| 欧美日韩国产在线看| 亚洲精品久久久久久久久久久久久| 欧美在线亚洲一区| 深夜福利一区二区| 久久99国产精品久久久久久久久| 欧洲s码亚洲m码精品一区| 国产精品久久久久久亚洲调教| 国产欧美精品一区二区三区介绍| 亚洲欧美精品伊人久久| 在线成人中文字幕| 日韩av在线天堂网| 久久99视频免费| 欧美xxxx18性欧美| 亚洲午夜精品久久久久久久久久久久| 国产成人综合亚洲| www.国产一区|