摘要:沒錯,不支持,從導(dǎo)出的文檔也可以看到,部分中文無法顯示,目前我也尚未找到是否有配置可以實(shí)現(xiàn)這個(gè)功能。相對前面的方式,使用起來更加簡單,也可以修改配置輸出中文。
更多精彩博文,歡迎訪問我的個(gè)人博客
說明我個(gè)人是一直使用Swagger作為接口文檔的說明的。但是由于在一些情況下,接口文檔說明需要以文件的形式交付出去,如果再重新寫一份文檔難免有些麻煩。于是在網(wǎng)上看到了Swagger2Markup + asciidoctor導(dǎo)出PDF的方法,百度一番后感覺網(wǎng)上的文章還是有很多沒有描述清楚的地方,遂還是硬著頭皮把官方的英文文檔大致瀏覽了一下,按照自己的思路整理出具體的步驟。
本文用到的工具:
Gradle - 4.10.3
SpringBoot - 2.1.6.RELEASE
Swagger - 2.9.2
Swagger2Markup - 1.3.3
asciidoctor
spring-restdocs-mockmvc
準(zhǔn)備Swagger數(shù)據(jù)SpringBoot中使用Swagger的過程就不再贅述了,下面是本文使用的范例:
@Configuration @EnableSwagger2 class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.jptangchina.gradle.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Swagger2Markup Test Api") .version("1.0") .build(); } }
@RestController @RequestMapping("/user") @Api(tags = "用戶接口") public class UserController { @ApiOperation("用戶登錄") @ResponseBody @PostMapping("/login") public Result使用org.asciidoctor.convert生成PDF(個(gè)人不推薦使用)login( @ApiParam(value = "用戶名", example = "jptangchina", required = true) @RequestParam String username, @ApiParam(value = "密碼", example = "jptangchina", required = true) @RequestParam String password) { return Result.ok(); } }
官方教程地址:https://github.com/Swagger2Ma...
僅為了簡單的導(dǎo)出PDF而言,本文針對官方案例均有所改動,去掉了部分沒有用到的配置。
1. 獲取Swagger json文件Swagger頁面本質(zhì)上也就是對json文件進(jìn)行解析。這里需要先編寫單元測試訪問/v2/api-docs接口并將json文件保存到本地。
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc class SwaggerTest { @Autowired private MockMvc mockMvc; @Test public void generateAsciiDocsToFile() throws Exception { String outputDir = System.getProperty("io.springfox.staticdocs.outputDir"); MvcResult mvcResult = this.mockMvc.perform(get("/v2/api-docs") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); MockHttpServletResponse response = mvcResult.getResponse(); String swaggerJson = response.getContentAsString(); Files.createDirectories(Paths.get(outputDir)); try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputDir, "swagger.json"), StandardCharsets.UTF_8)){ writer.write(swaggerJson); } } }
System.getProperty("io.springfox.staticdocs.outputDir");來自于build.gradle中的配置2. 將json文件轉(zhuǎn)換為adoc文件
轉(zhuǎn)換json文件需要使用到io.github.swagger2markup插件的convertSwagger2markup方法。
引入相關(guān)依賴:
buildscript { ... dependencies { ... classpath "io.github.swagger2markup:swagger2markup-gradle-plugin:1.3.3" } } apply plugin: "io.github.swagger2markup"
配置convertSwagger2markup:
ext { asciiDocOutputDir = file("${buildDir}/asciidoc") swaggerOutputDir = file("${buildDir}/swagger") } test { systemProperty "io.springfox.staticdocs.outputDir", swaggerOutputDir } convertSwagger2markup { dependsOn test swaggerInput "${swaggerOutputDir}/swagger.json" outputDir asciiDocOutputDir config = [ "swagger2markup.pathsGroupedBy" : "TAGS", ] }
更多config配置可以參考:http://swagger2markup.github....3. 將adoc文件轉(zhuǎn)換為PDF文件
轉(zhuǎn)換PDF文件需要用到org.asciidoctor.convert插件的asciidoctor方法。
引入相關(guān)依賴:
buildscript { ... dependencies { ... classpath "org.asciidoctor:asciidoctor-gradle-plugin:1.5.3" } } apply plugin: "org.asciidoctor.convert"
手動編寫index.adoc文件,放置到${asciiDocOutputDir.absolutePath}中:
include::{generated}/overview.adoc[] include::{generated}/paths.adoc[] include::{generated}/definitions.adoc[] include::{generated}/security.adoc[]
{generated}默認(rèn)值為${build}/asciidoc,參見:https://github.com/Swagger2Ma...
配置asciidoctor:
asciidoctor { dependsOn convertSwagger2markup // sourceDir中需要包含有之前手動編寫的index.adoc文件 sourceDir(asciiDocOutputDir.absolutePath) sources { include "index.adoc" } backends = ["pdf"] attributes = [ doctype: "book", toc: "left", toclevels: "3", numbered: "", sectlinks: "", sectanchors: "", hardbreaks: "", generated: asciiDocOutputDir ] }4. 編寫一個(gè)自定義task用來執(zhí)行上述流程:
task genPdf(type: Test, dependsOn: test) { include "**/*SwaggerTest.class" exclude "**/*" dependsOn(asciidoctor) }
執(zhí)行g(shù)enPdf,就可以生成Swagger對應(yīng)的PDF文件。
5. 小結(jié)使用此方法步驟還是比較繁瑣的,總體來講就是json -> adoc -> pdf,并且使用此種方法目前有幾個(gè)比較大的問題我仍然沒有找到解決方案:
從官方文檔中可以看到支持的語言默認(rèn)有EN, DE, FR, RU。沒錯,不支持CN,從導(dǎo)出的文檔也可以看到,部分中文無法顯示,目前我也尚未找到是否有配置可以實(shí)現(xiàn)這個(gè)功能。網(wǎng)上的文章部分是通過替換源代碼包里面的字體文件來實(shí)現(xiàn),但是由于后面有更好的解決方案,這里就不再討論。
從asciidoctorj-pdf的1.5.0-alpha.16版本以后(目前最新是1.5.0-alpha.18),這種方式生成文件會拋出異常,我個(gè)人并沒有深究這個(gè)異常,有興趣的讀者可以通過修改版本號試一試。
生成的adoc文件一般包含overview.adoc、paths.adoc、definitions.adoc、security.adoc一共4個(gè)文件,這也是為什么要手動編寫index.adoc進(jìn)行整合的原因,感覺不太方便。
綜上,我個(gè)人并不推薦采用此方式生成PDF。
build.gradle完整文件參考:
buildscript { ext { springbootVersion = "2.1.6.RELEASE" } repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public" } } dependencies { classpath "org.springframework.boot:spring-boot-gradle-plugin:${springbootVersion}" classpath "org.asciidoctor:asciidoctor-gradle-plugin:1.5.3" classpath "io.github.swagger2markup:swagger2markup-gradle-plugin:1.3.3" } } repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public" } } apply plugin: "java" apply plugin: "maven" apply plugin: "org.springframework.boot" apply plugin: "io.spring.dependency-management" apply plugin: "io.github.swagger2markup" apply plugin: "org.asciidoctor.convert" group "com.jptangchina" version "1.0-SNAPSHOT" sourceCompatibility = 1.8 targetCompatibility = 1.8 ext { asciiDocOutputDir = file("${buildDir}/asciidoc") swaggerOutputDir = file("${buildDir}/swagger") swaggerVersion = "2.9.2" } dependencies { compile "org.springframework.boot:spring-boot-starter-web" compile "io.springfox:springfox-swagger2:${swaggerVersion}" compile "io.springfox:springfox-swagger-ui:${swaggerVersion}" compile "io.github.swagger2markup:swagger2markup:1.3.3" asciidoctor "org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16" testCompile "org.springframework.boot:spring-boot-starter-test" testCompile "org.springframework.restdocs:spring-restdocs-mockmvc" } test { systemProperty "io.springfox.staticdocs.outputDir", swaggerOutputDir } convertSwagger2markup { dependsOn test swaggerInput "${swaggerOutputDir}/swagger.json" outputDir asciiDocOutputDir config = [ "swagger2markup.pathsGroupedBy" : "TAGS", ] } asciidoctor { dependsOn convertSwagger2markup sourceDir(asciiDocOutputDir.absolutePath) sources { include "index.adoc" } backends = ["pdf"] attributes = [ doctype: "book", toc: "left", toclevels: "3", numbered: "", sectlinks: "", sectanchors: "", hardbreaks: "", generated: asciiDocOutputDir ] } task genPdf(type: Test, dependsOn: test) { include "**/*SwaggerTest.class" exclude "**/*" dependsOn(asciidoctor) }使用asciidoctor-gradle-plugin生成PDF(推薦)
asciidoctor-gradle-plugin也是官方推薦的使用方式。相對前面的方式,使用起來更加簡單,也可以修改配置輸出中文。
1. 引入插件plugins { id "org.asciidoctor.jvm.pdf" version "2.2.0" }2. 編寫測試類生成adoc
與第一中方法不同的是,不需要再將json文件保存到本地了。
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class SwaggerTest { @Autowired private MockMvc mockMvc; @Test public void generateAsciiDocsToFile() throws Exception { String outputDir = System.getProperty("io.springfox.staticdocs.outputDir"); MvcResult mvcResult = this.mockMvc.perform(get("/v2/api-docs") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() .withMarkupLanguage(MarkupLanguage.ASCIIDOC) .withOutputLanguage(Language.ZH) .withPathsGroupedBy(GroupBy.TAGS) .withGeneratedExamples() .withoutInlineSchema() .build(); MockHttpServletResponse response = mvcResult.getResponse(); String swaggerJson = response.getContentAsString(); Swagger2MarkupConverter.from(swaggerJson) .withConfig(config) .build() .toFile(Paths.get(outputDir + "/swagger")); } }
有興趣的讀者可以閱讀下toFile方法的源碼,里面對第一種方法生成的4個(gè)文件進(jìn)行了整合,這也是不再需要手動編寫index.adoc文件的原因。3. 配置asciidoctorPdf
ext { asciiDocOutputDir = file("${buildDir}/asciidoc") // 創(chuàng)建字體與主題的文件夾 pdfFontsDir = file("${buildDir}/fonts") pdfThemesDir = file("${buildDir}/themes") swaggerVersion = "2.9.2" } pdfThemes { local "basic", { styleDir = pdfThemesDir // styleName會被程序用于匹配${styleName}-theme.yml,如default-styleName-theme.yml styleName = "default" } } asciidoctorPdf{ sourceDir(asciiDocOutputDir.absolutePath) sources { include "swagger.adoc" } fontsDir(pdfFontsDir.absolutePath) theme("basic") }
本文字體與主題文件均來自于asciidoctorj-pdf-1.5.0-alpha.18.jar源碼包,其路徑位于:gems/asciidoctorj-pdf-1.5.0-alpha.18/data4. 復(fù)制并修改default-theme.yml文件配置
為了解決中文無法顯示的問題,首先需要自行下載一個(gè)支持中文的字體文件。
修改主題文件,將mplus1p-regular-fallback.ttf替換為自己下載的字體文件的名稱。
M+ 1p Fallback: normal: your-font.ttf bold: your-font.ttf italic: your-font.ttf bold_italic: your-font.ttf
由于手動指定了字體文件的路徑,所以除了中文以外,還需要將源碼中的其他字體文件一并復(fù)制到${pdfFontsDir}文件夾。如果不愿意使用官方的字體,也可以考慮將default-theme.yml中其他的字體文件都修改為自己想要的文件。
保持task genPdf不變,再次運(yùn)行即可生成PDF文件,生成的文件默認(rèn)路徑為${build}/docs/asciidocPdf
小結(jié)asciidoctor-gradle-plugin的方式可以支持配置字體與主題,通過配置不僅規(guī)避了中文無法顯示的問題,同時(shí)使用起來也更加簡單。需要注意的是,采用此種方案生成出的文檔會在封面寫有項(xiàng)目的版本號,此版本號為build.gradle中的version,而非SwaggerConfig類中的version。
官方提供了很多配置,可以自行參考官方文檔查看。
build.gradle完整文件參考:
buildscript { ext { springbootVersion = "2.1.6.RELEASE" } repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public" } } dependencies { classpath "org.springframework.boot:spring-boot-gradle-plugin:${springbootVersion}" } } plugins { id "org.asciidoctor.jvm.pdf" version "2.2.0" } repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public" } } apply plugin: "java" apply plugin: "maven" apply plugin: "org.springframework.boot" apply plugin: "io.spring.dependency-management" group "com.jptangchina" version "1.0-SNAPSHOT" sourceCompatibility = 1.8 targetCompatibility = 1.8 ext { asciiDocOutputDir = file("${buildDir}/asciidoc") pdfFontsDir = file("${buildDir}/fonts") pdfThemesDir = file("${buildDir}/themes") swaggerVersion = "2.9.2" } dependencies { compile "org.springframework.boot:spring-boot-starter-web" compile "io.springfox:springfox-swagger2:${swaggerVersion}" compile "io.springfox:springfox-swagger-ui:${swaggerVersion}" compile "io.github.swagger2markup:swagger2markup:1.3.3" testCompile "org.springframework.boot:spring-boot-starter-test" testCompile "org.springframework.restdocs:spring-restdocs-mockmvc" } test { systemProperty "io.springfox.staticdocs.outputDir", asciiDocOutputDir } pdfThemes { local "basic", { styleDir = pdfThemesDir styleName = "default" } } asciidoctorPdf{ sourceDir(asciiDocOutputDir.absolutePath) sources { include "swagger.adoc" } fontsDir(pdfFontsDir.absolutePath) theme("basic") } task genPdf(type: Test, dependsOn: test) { include "**/*SwaggerTest.class" exclude "**/*" dependsOn(asciidoctorPdf) }參考
https://github.com/Swagger2Markup/swagger2markup
https://github.com/Swagger2Markup/spring-swagger2markup-demo
http://swagger2markup.github.io/swagger2markup/1.3.3
更多精彩博文,歡迎訪問我的個(gè)人博客
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74990.html
摘要:日期和時(shí)間處理日期和時(shí)間的函數(shù)庫。使用中可觀察序列,創(chuàng)建異步基于事件應(yīng)用程序的函數(shù)庫。為分布式系統(tǒng)提供延遲和容錯處理。發(fā)布使用本機(jī)格式分發(fā)應(yīng)用程序的工具。將程序資源和打包成和的本機(jī)文件。圖像處理用來幫助創(chuàng)建評估或操作圖形的函數(shù)庫。 好資源要分享原文 譯者 唐尤華 翻譯自 github akullpp 構(gòu)建 這里搜集了用來構(gòu)建應(yīng)用程序的工具。 Apache Maven:Mave...
摘要:格式文檔導(dǎo)出,是信息系統(tǒng)中非常實(shí)用的一種功能,用于各種報(bào)表和文檔的到處。示例中,使用生成要導(dǎo)出的格式文檔,通過來實(shí)現(xiàn)文件下載。將轉(zhuǎn)換成文檔生成的代碼比較簡單,創(chuàng)建一個(gè)對象,然后會在指定的中輸入生成的文件。作用相當(dāng)于在中使用進(jìn)行配置。 showImg(https://segmentfault.com/img/remote/1460000008547574); PDF格式文檔導(dǎo)出,是信息系...
摘要:其標(biāo)準(zhǔn)為前身是,提供強(qiáng)大的在線編輯功能,包括語法高亮錯誤提示自動完成實(shí)時(shí)預(yù)覽,并且支持用戶以格式撰寫導(dǎo)入導(dǎo)出轉(zhuǎn)換文檔。 團(tuán)隊(duì)內(nèi)部RestAPI開發(fā)采用設(shè)計(jì)驅(qū)動開發(fā)的模式,即使用API設(shè)計(jì)文檔解耦前端和后端的開發(fā)過程,雙方只在聯(lián)調(diào)與測試時(shí)耦合。在實(shí)際開發(fā)和與前端合作的過程中,受限于眾多因素的影響,開發(fā)效率還有進(jìn)一步提高的空間。本文的目的是優(yōu)化工具鏈支持,減少一部分重復(fù)和枯燥的勞動。 現(xiàn)狀...
摘要:首先是從下載了,這個(gè)已經(jīng)能夠生成和文檔了,但是對中文支持不好,中文大部分會顯示為空白。關(guān)于這個(gè)對中文支持不好,查了很多資料,應(yīng)該是字體和主題的原因,所以參考了很多資料,結(jié)合當(dāng)前這個(gè),做出了最終的能很好支持中文的,最終地址。 做后端開發(fā),自然離不開接口文檔,接口文檔不僅方便后端開發(fā)人員之間查看,更是前端人員必要的文檔,也有可能提供給第三方來調(diào)用我們的接口。但是,寫接口文檔太費(fèi)時(shí)間,而且如...
摘要:在工作中,我們的前端工作流一般開始于前后端協(xié)商好文檔之后,再針對這個(gè)文檔做模擬數(shù)據(jù),然后用做好的進(jìn)行開發(fā),后端開發(fā)完畢之后再改一下數(shù)據(jù)的切換到正式進(jìn)行聯(lián)調(diào)如下本文介紹的一個(gè)工具或者說方法,來將這個(gè)工作流優(yōu)化一下,也是我平時(shí)工作正在用的方法, 在工作中,我們的前端工作流一般開始于前后端協(xié)商好Api文檔之后,再針對這個(gè)Api文檔做mock模擬數(shù)據(jù),然后用做好的mock進(jìn)行開發(fā),后端開發(fā)完畢...
閱讀 3216·2023-04-26 01:30
閱讀 678·2021-11-08 13:15
閱讀 1800·2021-09-24 10:35
閱讀 1012·2021-09-22 15:41
閱讀 1937·2019-08-30 15:44
閱讀 605·2019-08-30 13:22
閱讀 1015·2019-08-30 13:06
閱讀 1208·2019-08-29 13:22