从Swagger API文档生成PDF


93

我已经使用Swagger UI来显示我的REST Web服务并将其托管在服务器上。

但是,只能在特定服务器上访问Swagger的服务。如果我想脱机工作,有人知道如何使用Swagger UI创建静态PDF并使用它吗?此外,PDF易于与无法访问服务器的人员共享。

非常感谢!

Answers:


39

便捷方式:使用浏览器打印/预览

  1. 隐藏编辑器窗格
  2. 打印预览(我使用过firefox,其他也不错)
  3. 更改其页面设置并打印为pdf

在此处输入图片说明


简单!该文档非常好。
沙田

1
您甚至可以在两个文档设计之间进行选择,只要有两个Swagger服务即可:editor.swagger.io(新)和editor2.swagger.io(上一个)!
naXa

有效但有损的bcos swagger HTML UI具有多个选项卡,对于POST / PUT方法的参数,您必须在模型选项卡和示例值选项卡之间进行选择,然后在以PDF格式打印的版本中,其中之一将永远被隐藏:(
chrisinmtown

这对我不起作用。每个端点都将在页面末尾被切断(无论我使用哪种页面设置)。然后,下一页将从下一个Endpoint块的顶部开始。自从写了这个答案以来,也许有些事情发生了变化。
千字节字节

我仍然认为它是可行的,您可能需要调整边距。从editor.swagger.io
Osify

33

我想出了一种使用https://github.com/springfox/springfoxhttps://github.com/RobWin/swagger2markup的方法

使用Swagger 2实施文档。


嗨,我还试图使用swagger。离线文档生成文件吗?
Sunil Rk 2015年

是的,我使用了示例项目并将我的Web服务代码集成到其中,并且能够生成文档。
阿曼·穆罕默德

1
您能否简单地告诉我,我如何将我的Web服务集成到您上面提到的示例中。
Sunil Rk 2015年

swagger2markup项目需要REST API的JSON输入。如果下载该gradle项目并使用API​​详细信息更改其中的swagger.json文件,然后运行Swagger2MarkupConverterTest JUnit方法:testSwagger2HtmlConversion,它将在项目的build / docs / generated / asciidocAsString文件夹中为您生成HTML。换句话说,有两件事。1)首先使用Swagger Editor为REST API生成JSON格式。2)使用该JSON格式,您可以使用swagger2markup项目生成API的独立HTML文档
Aman Mohammed

22

您可以修改REST项目,以便在构建项目时生成所需的静态文档(html,pdf等)。

如果您有Java Maven项目,则可以使用下面的pom代码段。它使用一系列插件来生成pdf和html文档(该项目的REST资源)。

  1. rest-api-> swagger.json:swagger-maven-plugin
  2. swagger.json-> Asciidoc:swagger2markup-maven-plugin
  3. Asciidoc-> PDF:asciidoctor-maven-plugin

请注意,执行顺序很重要,因为一个插件的输出将成为下一个插件的输入:

<plugin>
    <groupId>com.github.kongchen</groupId>
    <artifactId>swagger-maven-plugin</artifactId>
    <version>3.1.3</version>
    <configuration>
        <apiSources>
            <apiSource>
                <springmvc>false</springmvc>
                <locations>some.package</locations>
                <basePath>/api</basePath>
                <info>
                    <title>Put your REST service's name here</title>
                    <description>Add some description</description>
                    <version>v1</version>
                </info>
                <swaggerDirectory>${project.build.directory}/api</swaggerDirectory>
                <attachSwaggerArtifact>true</attachSwaggerArtifact>
            </apiSource>
        </apiSources>
    </configuration>
    <executions>
        <execution>
            <phase>${phase.generate-documentation}</phase>
            <!-- fx process-classes phase -->
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>io.github.robwin</groupId>
    <artifactId>swagger2markup-maven-plugin</artifactId>
    <version>0.9.3</version>
    <configuration>
        <inputDirectory>${project.build.directory}/api</inputDirectory>
        <outputDirectory>${generated.asciidoc.directory}</outputDirectory>
        <!-- specify location to place asciidoc files -->
        <markupLanguage>asciidoc</markupLanguage>
    </configuration>
    <executions>
        <execution>
            <phase>${phase.generate-documentation}</phase>
            <goals>
                <goal>process-swagger</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.asciidoctor</groupId>
    <artifactId>asciidoctor-maven-plugin</artifactId>
    <version>1.5.3</version>
    <dependencies>
        <dependency>
            <groupId>org.asciidoctor</groupId>
            <artifactId>asciidoctorj-pdf</artifactId>
            <version>1.5.0-alpha.11</version>
        </dependency>
        <dependency>
            <groupId>org.jruby</groupId>
            <artifactId>jruby-complete</artifactId>
            <version>1.7.21</version>
        </dependency>
    </dependencies>
    <configuration>
        <sourceDirectory>${asciidoctor.input.directory}</sourceDirectory>
        <!-- You will need to create an .adoc file. This is the input to this plugin -->
        <sourceDocumentName>swagger.adoc</sourceDocumentName>
        <attributes>
            <doctype>book</doctype>
            <toc>left</toc>
            <toclevels>2</toclevels>
            <generated>${generated.asciidoc.directory}</generated>
            <!-- this path is referenced in swagger.adoc file. The given file will simply 
                point to the previously create adoc files/assemble them. -->
        </attributes>
    </configuration>
    <executions>
        <execution>
            <id>asciidoc-to-html</id>
            <phase>${phase.generate-documentation}</phase>
            <goals>
                <goal>process-asciidoc</goal>
            </goals>
            <configuration>
                <backend>html5</backend>
                <outputDirectory>${generated.html.directory}</outputDirectory>
                <!-- specify location to place html file -->
            </configuration>
        </execution>
        <execution>
            <id>asciidoc-to-pdf</id>
            <phase>${phase.generate-documentation}</phase>
            <goals>
                <goal>process-asciidoc</goal>
            </goals>
            <configuration>
                <backend>pdf</backend>
                <outputDirectory>${generated.pdf.directory}</outputDirectory>
                <!-- specify location to place pdf file -->
            </configuration>
        </execution>
    </executions>
</plugin>

asciidoctor插件假定存在要处理的.adoc文件。您可以创建一个仅收集由swagger2markup插件创建的插件:

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

如果要使生成的html文档成为war文件的一部分,则必须确保该文件出现在顶层-WEB-INF文件夹中的静态文件将不提供。您可以在maven-war-plugin中执行此操作:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <warSourceDirectory>WebContent</warSourceDirectory>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <webResources>
            <resource>
                <directory>${generated.html.directory}</directory>
            <!-- Add swagger.pdf to WAR file, so as to make it available as static content. -->
            </resource>
            <resource>
                <directory>${generated.pdf.directory}</directory>
            <!-- Add swagger.html to WAR file, so as to make it available as static content. -->
            </resource>
        </webResources>
    </configuration>
</plugin>

war插件适用于生成的文档-因此,您必须确保这些插件已在较早的阶段执行。


嗨@Hervian。好答案。到目前为止,我可以使用您的分析服务。我有两个同名的类,但包装不同。但是swagger.json仅包含其中一个的定义。另一个失踪了
埃德蒙

@Hervian在执行以下操作之前,我一直遇到错误1)创建文件src / main / asciidoc / swagger.adoc,其内容来自上方。2)将以下属性添加到POM:<phase.generate-documentation>过程类</phase.generate-documentation> <generated.asciidoc.directory> $ {project.build.directory} / api-gen </ generation。 asciidoc.directory>然后运行“ mvn install”,我看不到任何mvn或插件错误,但只有overview.adoc文件包含任何内容;definitions.adoc和paths.adoc文件保持为空。请指示。
chrisinmtown

15

我创建了一个专门解决该问题的网站https://www.swdoc.org/。因此,它会自动swagger.json -> Asciidoc, Asciidoc -> pdf按照答案中的建议进行转换。这样做的好处是您不需要执行安装过程。它接受url或原始json形式的规范文档。项目是用C#编写的,其页面是https://github.com/Irdis/SwDoc

编辑

如果您在使用SwDoc时遇到任何问题(例如pdf生成不完整),最好在此处验证您的json规范:http://editor.swagger.io/。


3
thx,是的,非常好,我在工作项目中使用它。我正在考虑在业余时间编写一些代码来支持openapi 3.0。
Irdis

2
它所依赖的工具的所有荣耀
归功于

@ Irdis我尝试使用链接。它允许解析Swagger 2.0文档,但是我提供的文档是Open API 3.0,并且无法生成该文档。
hellowahab

我尝试了3+摇摇欲坠-效果很好,尽管显示了原始的html注释...
Sasha Bond

这是一个很棒的工具!如果您遇到过像我这样的问题(例如pdf生成不完整),请在此处粘贴您的json:editor.swagger.io以自动进行验证,修复问题,然后最好返回swdoc工具并正确生成它这次。
Thales Valias

9

检出https://mrin9.github.io/RapiPdf一个具有大量自定义和本地化功能的自定义元素。

免责声明:我是该软件包的作者


2
刚刚经过测试,但是单击带有测试规范的“ Generate PDF”(petstore)后没有得到答复?
imehl

1
@imehl当我在mac / chrome,mac / firefox,mac / safari和Windows / chrome上测试我时,它工作正常。这仅适用于支持Chrome,Firefox和Safari等网络组件的网络浏览器。如果仍然遇到
Mrinmoy

@Mrinmoy我和imehl有相同的问题,它打开了新标签,但立即关闭了(ubuntu 18.04 + firefox / chrome都得到了相同的结果)。然后我在Windows上完成了它,它就像一个魅力。谢谢您使用此工具,它很棒。
达布克斯

3
@Dabux从未在ubuntu上进行测试,但是有一种情况我知道人们确实会遇到与您所解释的问题相同的情况,那就是当您在浏览器上有任何活动的阻止程序或弹出窗口阻止程序时
Mrinmoy

@Mrinmoy,您说得对,我启用了广告拦截程序,这是因为这个原因,而不是因为OS。
达布克斯

1

对我来说,最简单的解决方案是将swagger(v2)导入Postman,然后转到Web视图。您可以在此处选择“单列”视图,然后使用浏览器将其打印为pdf。不是自动化/集成解决方案,而是一次性使用。与从editor2.swagger.io进行打印相比,它处理纸张宽度要好得多,在该情况下,滚动条会导致部分内容被隐藏。


1
尝试使用此功能,但通过网页打印并不会添加多个链接和其他信息。
hellowahab

是的,我应该提到这一点。对我来说这不是问题。
西蒙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.