整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          網頁截圖和svg模版動態生成圖片Java實現

          Java實現根據svg模版動態生成圖片

          使用場景

          需要Java語言動態生成圖片

          用流程圖簡單說明下我這邊工作中使用的場景

          僅供參考

          所以這里就需要生成證書了

          我先給大家看下最終實現的圖片效果

          這里要先說明一下

          • 圖片上的文字都是動態變化的即不同的訂單對應的圖片內容都不一樣
          • 圖片上還可以嵌入圖片哦 比如上圖的logo圖片

          下面說下我是如何解決的

          通過PhantomJS來實現

          這種方式是不能實現這個需求的

          這個的原理就是對網頁截圖 但只能對于靜態頁面截圖 不能根據不同的參數值動態生成圖片

          所以不提倡使用這種方式

          但也介紹下這種使用方式 朋友們根據自己的實際需求情況有選擇的使用

          通過html代碼實現圖片的效果 放入web容器(比如nginx)中部署

          這是h5代碼

          test文件夾下面的內容

          安裝一個docker nginx 將test文件夾加載到nginx容器的/usr/share/nginx/html目錄下面

          docker run --name nginx80  -p 8000:80  -v /tmp/test:/usr/share/nginx/html -d docker.io/nginx
          

          訪問的頁面效果

          訪問該頁面進行截圖

          這張圖片是截圖生成的圖片 但url中的id值并沒有傳給頁面

          在h5代碼中請求后端接口獲取數據動態顯示出來也是不可以的

          所以這種方式使用局限性很窄

          簡單介紹下代碼原理

          大致原理是 通過http請求該url獲取該url的文件流然后解析h5代碼生成圖片

          通過SVG模版動態生成

          先寫svg模版(其實也是h5代碼)

          讀取svg模版 動態傳入參數生成圖片

          其實現原理大致為 讀取svg document h5代碼 將動態參數map解析到h5代碼中 轉換成字節數組 生成圖片格式

          Linux環境圖片中文亂碼

          我本地是mac系統沒有這個問題 在發布到測試環境linux系統出現了這個問題

          先看下問題的現象

          看到了沒 生成的圖片中文全是亂碼

          原因是因為linux系統沒有中文字體

          既然linux系統沒有中文字體 那么就安裝它嘛 let's 盤它!!!

          先看下mac環境的字體情況

          • 安裝字體管理工具
          brew install fontconfig
          
          • 查看支持中文
          fc-list :lang=zh    (注意‘:’前的空格)
          

          mac環境默認會安裝很多中文字體

          再看下linux環境

          • 安裝字體管理工具
          yum -y install fontconfig
          
          • 查看支持中文
          fc-list :lang=zh
          

          果然沒有中文字體

          開始安裝中文字體

          將mac環境的宋體上傳到linux環境

          a 先在mac系統中找到字體安裝目錄

          /System/Library/Fonts
          

          b 找到宋體對應的文件

          c 將該文件上傳到linux指定的目錄下

          /usr/share/fonts/chinese
          

          d 賦予文件夾操作權限

          chmod -R 755 /usr/share/fonts/chinese
          

          e 安裝ttmkfdir來搜索目錄中所有的字體信息,并匯總生成fonts.scale文件

          yum -y install ttmkfdir
          
          ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
          
          

          修改字體配置文件

          vi /etc/fonts/fonts.conf
          添加
          <dir>/usr/share/fonts/chinese</dir>
          

          刷新內存中的字體緩存

          fc-cache
          

          確認是否安裝成功

          在jdk中安裝該宋體

          a 找到jdk所在的安裝目錄

          echo $JAVA_HOME 
          

          b 將宋體文件復制過來

          cp /usr/share/fonts/chinese/STHeiti\ Light.ttc /usr/local/software/jdk1.8.0_141/jre/lib/fonts/fallback
          
          fallback代表存放后備語言的文件夾
          

          重啟java服務即可

          DEMO代碼

          https://gitee.com/pingfanrenbiji/resource/tree/master/image
          

          注意: 引入的依賴問題

            <!--phantomjs -->
            <dependency>
             <groupId>org.seleniumhq.selenium</groupId>
             <artifactId>selenium-java</artifactId>
             <version>2.53.1</version>
            </dependency>
            <dependency>
             <groupId>com.github.detro</groupId>
             <artifactId>ghostdriver</artifactId>
             <version>2.1.0</version>
            </dependency>
          
            <!--svg-->
            <dependency>
             <groupId>com.github.hui.media</groupId>
             <artifactId>svg-core</artifactId>
             <version>2.5</version>
            </dependency>
          
          

          這些依賴jar包我是上傳到了公司的私服上了

          若是朋友們下拉不下來

          我提供給大家這些底層jar包的實現源碼

          https://gitee.com/pingfanrenbiji/quick-media
          

          自行上傳到自己的私服即可

          前言

          Java編程生成word文檔這種操作一般是常規操作比較常見,主要采用Apache的POI Word 這個庫操作的比較多,還有的用Spire.Doc,但是這個庫有些稍微難點的功能要收費,看了下費用還不低,周末朋友問起是否有用java操作word加上下標的經驗,我是沒有的,不過剛好借機研究下。 本文主要聊下POI,畢竟是免費的,更值得研究。

          word 格式說明和POI支持情況: HWPF: MS-Word 97-2003(.doc),基于BIFF8格式的JAVA接口。只支持.doc文件簡單的操作,讀寫能力有限。本API為POI項目早期開發,很不幸的 是主要負責HWPF模塊開發的工程師-"Ryan Ackley"已經離開Apache組織,現在該模塊沒有人維護、更新、完善。 XWPF:MS-Word 2007+(.docx),基于OOXML格式的JAVA接口。較HWPF功能完善。

          二 安裝

          都是利用的jar,不存在什么安裝,直接配置pom文件即可。 添加POI的word的jar:

                  <!-- 操作excel的庫 注意版本保持一致 poi poi-ooxml  poi-scratchpad -->
              <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.2</version>
                <scope>compile</scope>
              </dependency>
          
              
           <!--poi-ooxml和*poi-ooxml-schemas*是poi對2007及以上版本的擴充。-->
              <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
                <scope>compile</scope>
              </dependency>
          
             <!--poi-ooxml和*poi-ooxml-schemas*是poi對2007及以上版本的擴充。-->
              <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>4.1.2</version>
                <scope>compile</scope>
              </dependency>
                
          
               <!-- WordToHtml .doc .odcx  poi  -->
                  <dependency>
                      <groupId>org.apache.poi</groupId>
                      <artifactId>poi-scratchpad</artifactId>
                      <version>4.1.2</version>
                  </dependency>
           
          

          三 基本使用

          3.1 核心類

          最核心的三個類: XWPFDocument : 文檔本身的抽象、代表整個文檔; XWPFParagraph: 段落、整個文檔可以看做一個個段落組成、簡單對應我們文章的段落; XWPFRun: 可以看做一個片段,整個段落由多個Run組成、每個Run可以有自己的文字內容、樣式等。

          XWPFTable: 表格,和段落平級;

          3.2 文檔

          創建文檔

          XWPFDocument doc = new XWPFDocument();
          或
          XWPFDocument doc = new XWPFDocument(new FileInputStream("./deepoove.docx"));
          

          獲取文檔上的元素、比如段落、表格、圖片等。

          // 段落
          List<XWPFParagraph> paragraphs = doc.getParagraphs();
          // 表格
          List<XWPFTable> tables = doc.getTables();
          // 圖片
          List<XWPFPictureData> allPictures = doc.getAllPictures();
          // 頁眉
          List<XWPFHeader> headerList = doc.getHeaderList();
          // 頁腳
          List<XWPFFooter> footerList = doc.getFooterList();
          

          生成文檔

          try (FileOutputStream out = new FileOutputStream("simple.docx")) {
              doc.write(out);
          }
          

          3.3 段落

          創建段落

          XWPFParagraph p1 = doc.createParagraph();
          

          段落樣式設置:

          // 對齊方式
          p1.setAlignment(ParagraphAlignment.CENTER);
          // 邊框
          p1.setBorderBottom(Borders.DOUBLE);
          p1.setBorderTop(Borders.DOUBLE);
          p1.setBorderRight(Borders.DOUBLE);
          p1.setBorderLeft(Borders.DOUBLE);
          p1.setBorderBetween(Borders.SINGLE);
          

          3.4 基本樣式Run

          Run是段落的基本組成單元,可以是一段文字、也可以是一張圖片、可以設置自己的不同樣式風格。

          獲取段落內容

          // 獲取文字
          String text = paragraph.getText();
          // 獲取段落內所有XWPFRun
          List<XWPFRun> runs = paragraph.getRuns();
          

          創建run

          // 段落末尾創建XWPFRun
          XWPFRun run = paragraph.createRun();
          run.setText("為這個段落追加文本");
          
          // 顏色
          run.setColor("00ff00");
          // 斜體
          run.setItalic(true);
          // 粗體
          run.setBold(true);
          // 字體
          run.setFontFamily("Courier");
          // 下劃線
          run.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
          

          獲取段落中run和修改run

          // 獲取文字
          String text = paragraph.getText();
          // 獲取段落內所有XWPFRun
          List<XWPFRun> runs = paragraph.getRuns();
          
          // 段落起始插入XWPFRun
          XWPFRun insertNewRun = paragraph.insertNewRun(0);
          insertNewRun.setText("在段落起始位置插入這段文本");
          

          修改run

          List<XWPFRun> runs = paragraph.getRuns();
          // setText默認為追加文本,參數0表示設置第0個位置的文本,覆蓋上一次設置
          runs.get(0).setText("追加文本", 0);
          runs.get(0).setText("修改文本", 0);
          

          文本換行

          run.addCarriageReturn();
          

          3.5 關于圖片

          提取文檔圖片

          List<XWPFPictureData> allPictures = doc.getAllPictures();
          XWPFPicture pciture = allPictures.get(0);
          byte[] data = pciture.getPictureData().getData();
          // 接下來就可以將圖片字節數組寫入輸出流
          

          利用XWPFRun創建圖片

          List<XWPFPictureData> allPictures = doc.getAllPictures();
          XWPFPicture pciture = allPictures.get(0);
          byte[] data = pciture.getPictureData().getData();
          // 接下來就可以將圖片字節數組寫入輸出流
          

          3.6 表格

          創建三行三列的表格

           XWPFTable table = doc.createTable(3, 3);
          

          設置單元格的文本 表格是由表格行XWPFRow構成,每行是由單元格XWPFCell構成,每個單元格內部又是由許多XWPFParagraph段落構成。

          table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE");
          

          上面代碼和下面代碼等價:

          XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
          XWPFRun r1 = p1.createRun();
          r1.setText("EXAMPLE OF TABLE")
          

          設置單元格里面的圖片,可以按照上述辦法獲取到單元格的XWPFRun然后按照run添加圖片的辦法進行。

          設置單元格的樣式

          XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
          XWPFRun r1 = p1.createRun();
          r1.setText("EXAMPLE OF TABLE")
          

          四 實例

          public class TestFirstDoc {
          
              public static void main(String[] args) throws IOException, InvalidFormatException {
                  XWPFDocument document = new XWPFDocument();
                  FileOutputStream out = new FileOutputStream(new File("測試文檔.docx"));
                  XWPFParagraph paragraph = document.createParagraph();
          
                  // 基本測試
                  XWPFRun paragraphOneRunOne = paragraph.createRun();
                  paragraphOneRunOne.setText("測試第一個Run");
                  paragraphOneRunOne.setBold(true);
                  paragraphOneRunOne.setItalic(true);
                  paragraphOneRunOne.addBreak();
          
                  // 樣式測試
                  XWPFRun paragraphRun2 = paragraph.createRun();
                  paragraphRun2.setText("為這個段落追加文本");
                  paragraphRun2.setFontSize(20);
                  paragraphRun2.setColor("00ff00");
                  paragraphRun2.setFontFamily("Courier");
                  paragraphRun2.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
          
                  // 上下標測試
                  XWPFRun paragraphRun3 = paragraph.createRun();
                  paragraphRun3.setText("設置正常文字");
          
          
                  XWPFRun paragraphRun4 = paragraph.createRun();
                  paragraphRun4.setText("上標");
                  paragraphRun4.setItalic(true);
                  paragraphRun4.setSubscript(VerticalAlign.SUPERSCRIPT);
          
                  XWPFRun paragraphRun5 = paragraph.createRun();
                  paragraphRun5.setText("下標");
                  paragraphRun5.setItalic(true);
                  paragraphRun5.setSubscript(VerticalAlign.SUBSCRIPT);
          
                  // 設置換頁,表格和上面內容分開來
                  XWPFParagraph paragraph2 = document.createParagraph();
                  paragraph2.setPageBreak(true);
          
                  
                  XWPFTable table = document.createTable(3, 3);
                  table.getRow(0).getCell(0).setText("Head1");
                  table.getRow(0).getCell(1).setText("Head2");
                  table.getRow(0).getCell(2).setText("Head3");
          
                  table.getRow(1).getCell(0).setText("col1");
                  table.getRow(1).getCell(1).setText("col2");
                  table.getRow(1).getCell(2).setText("col3");
          
                  XWPFParagraph p1 = table.getRow(2).getCell(0).addParagraph();
                  XWPFRun r1 = p1.createRun();
                  InputStream stream = new FileInputStream("D:\\1.jpg");
                  r1.addPicture(stream, XWPFDocument.PICTURE_TYPE_PNG, "Generated", Units.toEMU(256), Units.toEMU(256));
          
          
                  document.write(out);
                  out.close();
                  System.out.println("測試完成");
          
              }
          }
          
          

          效果圖:

          第二頁:

          些初學web前端的小伙伴會比較迷惑,HTML到底是什么呢?

          這里解釋一下,HTML稱為超文本標記語言,是一種標識性的語言。

          它包括一系列標簽,通過這些標簽可以將網絡上的文檔格式統一,使分散的Internet資源連接為一個邏輯整體。HTML文本是由HTML命令組成的描述性文本,HTML命令可以說明文字,圖形、動畫、聲音、表格、鏈接等。

          HTML的學習也是要由淺到深一步一步學習,對于很多小伙伴來說,HTML的學習路線一直是一個問題,下邊我列出HTML需要學習的幾個知識點,大家可以作為參考。

          HTML學習路線:

          ⒈ html概述

          html基本標簽

          ⒊ 圖片標簽

          ⒋ 超鏈接標簽

          ⒌ 表格標簽

          ⒍ 無序列表標簽

          ⒎ 有序列表標簽

          ⒏ 定義列表標簽

          ⒐ div標簽

          ⒑ 語義化標簽

          ⒒ 表單標簽

          ⒓ 語義化表單元素

          ⒔ 框架標簽

          ⒕ 特殊字符

          ⒖ 綜合案例

          針對以上的html知識點,動力節點也有非常適合初學者的HTML學習教程,相信大家通過HTML視頻課程的學習以后,會對HTML有一個深入的了解。

          HTML教程內容涵蓋:

          • HTML基礎語法
          • HTML概述
          • W3C概述
          • B/S架構系統原理
          • table
          • 背景色與背景圖片
          • 超鏈接
          • 列表
          • 表單
          • 框架等知識點

          通過該視頻的學習之后,可以開發基本的網頁,并且可以看懂別人編寫的HTML頁面。

          HTML學習資料:http://www.bjpowernode.com/?toutiaohtml.chai


          主站蜘蛛池模板: 日韩在线一区视频| 无码国产精品一区二区免费式直播| 538国产精品一区二区在线| 成人免费观看一区二区| 无码人妻品一区二区三区精99| 国产乱码精品一区二区三| 激情久久av一区av二区av三区| 无码国产精品一区二区免费 | 亚洲日韩精品一区二区三区无码| 制服美女视频一区| 精品一区二区91| 一区二区日韩国产精品| 亚洲av区一区二区三| 一区二区三区电影网| 中文国产成人精品久久一区| 成人一区二区免费视频| 国产一区二区电影在线观看| 中文字幕精品无码一区二区三区 | 精品人无码一区二区三区 | 美女毛片一区二区三区四区| 精品欧洲av无码一区二区| 精品国产aⅴ无码一区二区| 亚洲欧美国产国产一区二区三区| 欧美日韩精品一区二区在线观看 | 成人区人妻精品一区二区不卡视频| 一区二区视频在线免费观看| 一区二区三区日本电影| 狠狠做深爱婷婷综合一区| 无码人妻少妇色欲AV一区二区| 日韩免费一区二区三区在线| 无码aⅴ精品一区二区三区| 四虎永久在线精品免费一区二区| 岛国无码av不卡一区二区| 熟妇人妻AV无码一区二区三区| 一区一区三区产品乱码| 日本中文一区二区三区亚洲| 亚洲国产综合精品中文第一区| 女同一区二区在线观看| 国精产品一区一区三区| 亚洲国产精品无码第一区二区三区 | 无码精品视频一区二区三区|