swagger生成PDF接口文檔

1.在項目的的pom文件中引入依賴和插件

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

? ? ? ? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

? ? <modelVersion>4.0.0</modelVersion>

? ? <!--jcenter倉庫插件地址-->

? ? <pluginRepositories>

? ? ? ? <pluginRepository>

? ? ? ? ? ? <id>jcenter</id>

? ? ? ? ? ? <name>jcenter maven</name>

? ? ? ? ? ? <url>http://jcenter.bintray.com</url>

? ? ? ? </pluginRepository>

? ? </pluginRepositories>

? ? <properties>

? ? ? ? <!--swgger2markup 配置信息-->

? ? ? ? <swagger2markup.version>1.2.0</swagger2markup.version>

? ? ? ? <asciidoctor.input.directory>${project.basedir}/src/main/asciidoc</asciidoctor.input.directory>

? ? ? ? <swagger.output.dir>${project.build.directory}/swagger</swagger.output.dir>

? ? ? ? <swagger.snippetOutput.dir>${project.build.directory}/generated-snippets</swagger.snippetOutput.dir>

? ? ? ? <generated.asciidoc.directory>${project.build.directory}/asciidoc/generated</generated.asciidoc.directory>

? ? ? ? <asciidoctor.html.output.directory>${project.build.directory}/asciidoc/html</asciidoctor.html.output.directory>

? ? ? ? <asciidoctor.pdf.output.directory>${project.build.directory}/asciidoc/pdf</asciidoctor.pdf.output.directory>

? ? ? ? <swagger.input>${swagger.output.dir}/swagger.json</swagger.input>

? ? </properties>

? ? <!--生成swagger pdf文檔配置地址-->

? ? <repositories>

? ? ? ? <repository>

? ? ? ? ? ? <id>jcenter-snapshots</id>

? ? ? ? ? ? <name>jcenter</name>

? ? ? ? ? ? <url>http://oss.jfrog.org/artifactory/oss-snapshot-local/</url>

? ? ? ? </repository>

? ? </repositories>

? ? <dependencies>


? ? ? ? <!--swagger-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>com.jet</groupId>

? ? ? ? ? ? <artifactId>ecss_swagger_starter</artifactId>

? ? ? ? ? ? <version>0.0.2-RELEASE</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>io.springfox</groupId>

? ? ? ? ? ? <artifactId>springfox-swagger2</artifactId>

? ? ? ? ? ? <version>${springfox-version}</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>io.springfox</groupId>

? ? ? ? ? ? <artifactId>springfox-swagger-ui</artifactId>

? ? ? ? ? ? <version>${springfox-version}</version>

? ? ? ? </dependency>

? ? ? ? <!--MOCKMVC配置-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.restdocs</groupId>

? ? ? ? ? ? <artifactId>spring-restdocs-mockmvc</artifactId>

? ? ? ? ? ? <version>2.0.1.RELEASE</version>

? ? ? ? ? ? <scope>test</scope>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>io.springfox</groupId>

? ? ? ? ? ? <artifactId>springfox-data-rest</artifactId>

? ? ? ? ? ? <version>2.8.0</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>io.springfox</groupId>

? ? ? ? ? ? <artifactId>springfox-bean-validators</artifactId>

? ? ? ? ? ? <version>2.8.0</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>io.springfox</groupId>

? ? ? ? ? ? <artifactId>springfox-staticdocs</artifactId>

? ? ? ? ? ? <version>2.4.0</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>io.github.robwin</groupId>

? ? ? ? ? ? <artifactId>assertj-swagger</artifactId>

? ? ? ? ? ? <version>0.2.0</version>

? ? ? ? ? ? <scope>test</scope>

? ? ? ? </dependency>

? ? </dependencies>

? ? <dependencyManagement>

? ? ? ? <dependencies>

? ? ? ? ? ? <dependency>

? ? ? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? ? ? <artifactId>spring-cloud-dependencies</artifactId>

? ? ? ? ? ? ? ? <version>${spring-cloud.version}</version>

? ? ? ? ? ? ? ? <type>pom</type>

? ? ? ? ? ? ? ? <scope>import</scope>

? ? ? ? ? ? </dependency>

? ? ? ? </dependencies>

? ? </dependencyManagement>

? ? <build>

? ? ? ? <plugins>


<!--設置swagger輸出變量信息-->

? ? ? ? ? ? <plugin>

? ? ? ? ? ? ? ? <groupId>org.apache.maven.plugins</groupId>

? ? ? ? ? ? ? ? <artifactId>maven-surefire-plugin</artifactId>

? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? <systemPropertyVariables>


? ? ? ? ? ? ? ? ? ? ? ? <io.springfox.staticdocs.outputDir>${swagger.output.dir}</io.springfox.staticdocs.outputDir>

? ? ? ? ? ? ? ? ? ? ? ? <io.springfox.staticdocs.snippetsOutputDir>${swagger.snippetOutput.dir}</io.springfox.staticdocs.snippetsOutputDir>

? ? ? ? ? ? ? ? ? ? </systemPropertyVariables>

? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? </plugin>

? ? ? ? ? ? <!--asciidoc插件-->

? ? ? ? ? ? <plugin>

? ? ? ? ? ? ? ? <groupId>io.github.swagger2markup</groupId>

? ? ? ? ? ? ? ? <artifactId>swagger2markup-maven-plugin</artifactId>

? ? ? ? ? ? ? ? <version>${swagger2markup.version}</version>

? ? ? ? ? ? ? ? <dependencies>

? ? ? ? ? ? ? ? ? ? <dependency>

? ? ? ? ? ? ? ? ? ? ? ? <groupId>io.github.swagger2markup</groupId>

? ? ? ? ? ? ? ? ? ? ? ? <artifactId>swagger2markup-import-files-ext</artifactId>

? ? ? ? ? ? ? ? ? ? ? ? <version>${swagger2markup.version}</version>

? ? ? ? ? ? ? ? ? ? </dependency>

? ? ? ? ? ? ? ? ? ? <dependency>

? ? ? ? ? ? ? ? ? ? ? ? <groupId>io.github.swagger2markup</groupId>

? ? ? ? ? ? ? ? ? ? ? ? <artifactId>swagger2markup-spring-restdocs-ext</artifactId>

? ? ? ? ? ? ? ? ? ? ? ? <version>${swagger2markup.version}</version>

? ? ? ? ? ? ? ? ? ? </dependency>

? ? ? ? ? ? ? ? </dependencies>

? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? <swaggerInput>${swagger.input}</swaggerInput>

? ? ? ? ? ? ? ? ? ? <outputDir>${generated.asciidoc.directory}</outputDir>

? ? ? ? ? ? ? ? ? ? <config>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.markupLanguage>ASCIIDOC</swagger2markup.markupLanguage>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.pathsGroupedBy>TAGS</swagger2markup.pathsGroupedBy>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.extensions.dynamicOverview.contentPath>${project.basedir}/src/main/asciidoc/extensions/overview</swagger2markup.extensions.dynamicOverview.contentPath>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.extensions.dynamicDefinitions.contentPath>${project.basedir}/src/main/asciidoc/extensions/definitions</swagger2markup.extensions.dynamicDefinitions.contentPath>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.extensions.dynamicPaths.contentPath>${project.basedir}/src/main/asciidoc/extensions/paths</swagger2markup.extensions.dynamicPaths.contentPath>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.extensions.dynamicSecurity.contentPath>${project.basedir}src/main/asciidoc/extensions/security/</swagger2markup.extensions.dynamicSecurity.contentPath>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.extensions.springRestDocs.snippetBaseUri>${swagger.snippetOutput.dir}</swagger2markup.extensions.springRestDocs.snippetBaseUri>

? ? ? ? ? ? ? ? ? ? ? ? <swagger2markup.extensions.springRestDocs.defaultSnippets>true</swagger2markup.extensions.springRestDocs.defaultSnippets>

? ? ? ? ? ? ? ? ? ? </config>

? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? <executions>

? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? ? ? <phase>test</phase>

? ? ? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>convertSwagger2markup</goal>

? ? ? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? ? </executions>

? ? ? ? ? ? </plugin>

? ? ? ? ? ? <!--Asciidoctor插件 -->

? ? ? ? ? ? <plugin>

? ? ? ? ? ? ? ? <groupId>org.asciidoctor</groupId>

? ? ? ? ? ? ? ? <artifactId>asciidoctor-maven-plugin</artifactId>

? ? ? ? ? ? ? ? <version>1.5.3</version>

? ? ? ? ? ? ? ? <!-- PDF依賴 -->

? ? ? ? ? ? ? ? <dependencies>

? ? ? ? ? ? ? ? ? ? <dependency>

? ? ? ? ? ? ? ? ? ? ? ? <groupId>org.asciidoctor</groupId>

? ? ? ? ? ? ? ? ? ? ? ? <artifactId>asciidoctorj-pdf</artifactId>

? ? ? ? ? ? ? ? ? ? ? ? <version>1.5.0-alpha.10.1</version>

? ? ? ? ? ? ? ? ? ? </dependency>

? ? ? ? ? ? ? ? ? ? <dependency>

? ? ? ? ? ? ? ? ? ? ? ? <groupId>org.jruby</groupId>

? ? ? ? ? ? ? ? ? ? ? ? <artifactId>jruby-complete</artifactId>

? ? ? ? ? ? ? ? ? ? ? ? <version>1.7.21</version>

? ? ? ? ? ? ? ? ? ? </dependency>

? ? ? ? ? ? ? ? </dependencies>

? ? ? ? ? ? ? ? <!-- 生成文件時的配置信息 -->

? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? <sourceDirectory>${asciidoctor.input.directory}</sourceDirectory>

? ? ? ? ? ? ? ? ? ? <sourceDocumentName>index.adoc</sourceDocumentName>

? ? ? ? ? ? ? ? ? ? <attributes>

? ? ? ? ? ? ? ? ? ? ? ? <doctype>book</doctype>

? ? ? ? ? ? ? ? ? ? ? ? <toc>left</toc>

? ? ? ? ? ? ? ? ? ? ? ? <toclevels>3</toclevels>

? ? ? ? ? ? ? ? ? ? ? ? <numbered></numbered>

? ? ? ? ? ? ? ? ? ? ? ? <hardbreaks></hardbreaks>

? ? ? ? ? ? ? ? ? ? ? ? <sectlinks></sectlinks>

? ? ? ? ? ? ? ? ? ? ? ? <sectanchors></sectanchors>

? ? ? ? ? ? ? ? ? ? ? ? <generated>${generated.asciidoc.directory}</generated>

? ? ? ? ? ? ? ? ? ? </attributes>

? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? <!-- Since each execution can only handle one backend, run

? ? ? ? ? ? ? ? ? ? separate executions for each desired output type -->

? ? ? ? ? ? ? ? <executions>

? ? ? ? ? ? ? ? ? ? <!--生成html-->

? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? ? ? <id>output-html</id>

? ? ? ? ? ? ? ? ? ? ? ? <phase>test</phase>

? ? ? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>process-asciidoc</goal>

? ? ? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <backend>html5</backend>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <outputDirectory>${asciidoctor.html.output.directory}</outputDirectory>

? ? ? ? ? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? ? ? ? <!--生成pdf-->

? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? ? ? <id>output-pdf</id>

? ? ? ? ? ? ? ? ? ? ? ? <phase>test</phase>

? ? ? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>process-asciidoc</goal>

? ? ? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <backend>pdf</backend>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <outputDirectory>${asciidoctor.pdf.output.directory}</outputDirectory>

? ? ? ? ? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? ? </executions>

? ? ? ? ? ? </plugin>

? ? ? ? </plugins>

? ? </build>

</project>

2.在項目的test目錄中加入兩個java類文件括改,加入后運行一次SwaggerTest.java渣淤,為了生成swagger.json颖杏,可到項目目錄target\swagger中查看是否生成了swagger.json梯刚。


ControllerTest.java

package com.jet.ecss.contact.support;

import org.junit.Before;

import org.junit.Rule;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.restdocs.JUnitRestDocumentation;

import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;

import org.springframework.test.context.junit4.SpringRunner;

import org.springframework.test.web.servlet.MockMvc;

import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import org.springframework.web.context.WebApplicationContext;

@SpringBootTest

@RunWith(SpringRunner.class)

@AutoConfigureMockMvc

public abstract class ControllerTest {

? ? protected MockMvc mockMvc;

? ? @Autowired

? ? protected WebApplicationContext context;

? ? @Rule

? ? public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation();

? ? @Before

? ? public void setUp() {

? ? ? ? this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)

? ? ? ? ? ? ? ? .apply(MockMvcRestDocumentation.documentationConfiguration(this.restDocumentation))

? ? ? ? ? ? ? ? .build();

? ? }

}

SwaggerTest.java

package com.jet.ecss.contact.support;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.http.MediaType;

import java.io.BufferedWriter;

import java.nio.charset.StandardCharsets;

import java.nio.file.Files;

import java.nio.file.Paths;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

public class SwaggerTest extends ControllerTest {

? ? private final static Logger logger = LoggerFactory.getLogger(SwaggerTest.class);

? ? @Test

? ? public void createSwaggerJson() throws Exception {

? ? ? ? logger.info("------ 獲取用于生成自動文檔的swagger.json文件 ------");

? ? ? ? String swaggerJson = this.mockMvc.perform(get("/v2/api-docs").accept(MediaType.APPLICATION_JSON))

? ? ? ? ? ? ? ? .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();

? ? ? ? // 對應pom.xml中 <systemPropertyVariables> 設置的屬性值

//? ? ? ? String outputDir = System.getProperty("io.springfox.staticdocs.outputDir");

? ? ? ? String outputDir = "target/swagger";

? ? ? ? Files.createDirectories(Paths.get(outputDir));

? ? ? ? try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputDir, "swagger.json"), StandardCharsets.UTF_8)) {

? ? ? ? ? ? writer.write(swaggerJson);

? ? ? ? }

? ? ? ? return;

? ? }

}

3.在項目main目錄新建目錄asciidoc,在里面新建一個index.adoc文件宗收,文件內容如下

include::{generated}/overview.adoc[]

include::{generated}/paths.adoc[]

include::{generated}/security.adoc[]

include::{generated}/definitions.adoc[]


4.執(zhí)行mvn package -Dmaven.test.skip=true芯砸,生成的接口文檔在項目的target/asciidoc/pdf


!Z逡薄!最后滥嘴,asciidoctor-maven-plugin插件對中文的支持不夠友好木蹬,可能會出現(xiàn)pdf中文的丟失或者亂碼,需要對插件字體進行替換

1.在maven倉庫中找到該jar包


2.找到jar之后若皱,打開字體文件路徑:asciidoctorj-pdf-1.5.0-alpha.10.1.jar\gems\asciidoctor-pdf-1.5.0.alpha.10\data\fonts?


3.在fonts下面有以.ttf結尾的字體文件镊叁,使用哪個字體文件,就是在這里指定的走触,先把自己下載好的字體文件加進去

4.修改asciidoctorj-pdf-1.5.0-alpha.10.1.jar\gems\asciidoctor-pdf-1.5.0.alpha.10\data\themes下面的default-theme.yml配置文件:?


5.修改完成之后晦譬,保存,再去執(zhí)行生成命令mvn package -Dmaven.test.skip=true

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末互广,一起剝皮案震驚了整個濱河市蛔添,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兜辞,老刑警劉巖迎瞧,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逸吵,居然都是意外死亡凶硅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門扫皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來足绅,“玉大人,你說我怎么就攤上這事韩脑∏饴瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵段多,是天一觀的道長首量。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么加缘? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任鸭叙,我火速辦了婚禮,結果婚禮上拣宏,老公的妹妹穿的比我還像新娘沈贝。我一直安慰自己,他們只是感情好勋乾,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布宋下。 她就那樣靜靜地躺著,像睡著了一般辑莫。 火紅的嫁衣襯著肌膚如雪学歧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天摆昧,我揣著相機與錄音撩满,去河邊找鬼蜒程。 笑死绅你,一個胖子當著我的面吹牛,可吹牛的內容都是我干的昭躺。 我是一名探鬼主播忌锯,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼领炫!你這毒婦竟也來了偶垮?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤帝洪,失蹤者是張志新(化名)和其女友劉穎似舵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葱峡,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡砚哗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砰奕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛芥。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖军援,靈堂內的尸體忽然破棺而出仅淑,到底是詐尸還是另有隱情,我是刑警寧澤胸哥,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布涯竟,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏昆禽。R本人自食惡果不足惜蝗蛙,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醉鳖。 院中可真熱鬧捡硅,春花似錦、人聲如沸盗棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纹因。三九已至喷屋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞭恰,已是汗流浹背屯曹。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惊畏,地道東北人恶耽。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像颜启,于是被迫代替她去往敵國和親偷俭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容