Java實現根據svg模版動態生成圖片
需要Java語言動態生成圖片
用流程圖簡單說明下我這邊工作中使用的場景
僅供參考
所以這里就需要生成證書了
我先給大家看下最終實現的圖片效果
這里要先說明一下
下面說下我是如何解決的
這種方式是不能實現這個需求的
這個的原理就是對網頁截圖 但只能對于靜態頁面截圖 不能根據不同的參數值動態生成圖片
所以不提倡使用這種方式
但也介紹下這種使用方式 朋友們根據自己的實際需求情況有選擇的使用
這是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 document h5代碼 將動態參數map解析到h5代碼中 轉換成字節數組 生成圖片格式
我本地是mac系統沒有這個問題 在發布到測試環境linux系統出現了這個問題
先看下問題的現象
看到了沒 生成的圖片中文全是亂碼
原因是因為linux系統沒有中文字體
既然linux系統沒有中文字體 那么就安裝它嘛 let's 盤它!!!
brew install fontconfig
fc-list :lang=zh (注意‘:’前的空格)
mac環境默認會安裝很多中文字體
yum -y install fontconfig
fc-list :lang=zh
果然沒有中文字體
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
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代表存放后備語言的文件夾
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>
最核心的三個類: XWPFDocument : 文檔本身的抽象、代表整個文檔; XWPFParagraph: 段落、整個文檔可以看做一個個段落組成、簡單對應我們文章的段落; XWPFRun: 可以看做一個片段,整個段落由多個Run組成、每個Run可以有自己的文字內容、樣式等。
XWPFTable: 表格,和段落平級;
創建文檔
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);
}
創建段落
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);
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();
提取文檔圖片
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();
// 接下來就可以將圖片字節數組寫入輸出流
創建三行三列的表格
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基本標簽
⒊ 圖片標簽
⒋ 超鏈接標簽
⒌ 表格標簽
⒍ 無序列表標簽
⒎ 有序列表標簽
⒏ 定義列表標簽
⒐ div標簽
⒑ 語義化標簽
⒒ 表單標簽
⒓ 語義化表單元素
⒔ 框架標簽
⒕ 特殊字符
⒖ 綜合案例
針對以上的html知識點,動力節點也有非常適合初學者的HTML學習教程,相信大家通過HTML視頻課程的學習以后,會對HTML有一個深入的了解。
通過該視頻的學習之后,可以開發基本的網頁,并且可以看懂別人編寫的HTML頁面。
HTML學習資料:http://www.bjpowernode.com/?toutiaohtml.chai
*請認真填寫需求信息,我們會在24小時內與您取得聯系。