如何将脚本中的 Confluence 页面导出为 PDF

问题描述 投票:0回答:4

我想自动将一些 Confluence 页面导出为 PDF。

可通过网址下载:

  • http://<confluence server>/confluence/spaces/flyingpdf/pdfpageexport.action?pageId=<pageID>

输入此网址时,效果非常好。

但是当我尝试使用

wget
下载时,会下载一个 HTML 页面(要求登录名和密码)。我尝试使用
--user
--password
wget 选项提供登录名/密码,但它不起作用。

您有想法向

wget
命令提供汇合凭证吗?或者其他下载 PDF 页面的解决方案?

wget confluence export-to-pdf
4个回答
4
投票

如果您使用 Confluence 5.5 之前的 Confluence 服务器,那么您很幸运! Confluence 有一个 API 可以处理这个问题,请参阅他们的文档

更新:如果您使用的是 Confluence Server 5.5 或更高版本,默认情况下它们不会为此启用 API。请参阅Confluence 管理 > 进一步配置 以启用 XML-RPC 和 SOAP API。 (感谢@fatpanther指出了这一点)

新的 REST API 不支持此功能,请参阅 REST API 文档

您可以使用 Confluence 命令行界面 导出为 PDF。


4
投票

首先请求资源:

curl -D- -u user:pwd -X GET -H "Content-Type: application/json" "https://your-url/confluence/spaces/flyingpdf/pdfpageexport.action?pageId=12345678"

从生成的 JSON 中提取“位置”值(例如 grep | cut),然后使用调整后的 URL 和 mime 类型重复查询:

curl -D- -u user:pwd -X GET -H "Content-Type: text/html;charset=UTF-8" "https://your-url/$LOCATION_JUST_EXTRACTED" --output file.pdf

3
投票

Narcolessico 的答案对我有用,但我花了一些时间才完全理解该方法。我将添加到上面提供的答案。

注意: 我正在使用 Java (Apache HttpClient) 向 Confluence 服务器执行 HTTP GET 请求。

  1. 我使用 Chrome 导航到我想要导出为 PDF 的 Confluence 页面。我展开了工具菜单,右键单击“导出为 PDF”,然后单击“检查”。这将显示此菜单选项的底层 HTML 元素,其中包含用于启动 PDF 导出操作的链接。

检查元素以查找 url

  1. 元素检查揭示了 PDF 导出操作的相关链接,如下所示。

html 源

  1. 在 Java 中,如果您执行 HTTP GET 到 https://your-confluence-server-hostname/the-relative-link-from-step-2,您将需要禁用重定向处理。这就是 Narcolessico 的回答让我感到困惑的地方,因为我从 cURL 和 Java 中得到了不同的响应。当我意识到 cURL 操作返回 302 响应并且 Apache Http 客户端自动处理它时,我找到了一种禁用自动重定向处理的方法,以便我可以捕获 Location 标头信息。

禁用自动重定向处理的代码如下。

    final HttpClient client = HttpClientBuilder
        .create()
        .setSSLContext(sslContext)
        .disableRedirectHandling() // disable the auto handling here
        .build();

    final String urlToGetLocation = "https://<your-confluence-server-hostname><the-relative-link-from-step-2>"

    final HttpGet request = new HttpGet(urlToGetLocation);
    // You'll need to provide Basic Auth credentials. This is a base-64 encoded
    // username:password string, else the Location header returned will be a 
    // redirect to the login page.
    request.setHeader(HttpHeaders.AUTHORIZATION, authorizationHeaderValue);
    request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");

    final HttpResponse response = client.execute(request);

    final HttpEntity payload = response.getEntity();

注意: 我还重写了 SSL 上下文以不执行任何操作。如果 Confluence 使用 HTTP,这是您可能需要解决的另一个问题。

顺便说一句,如果您要对上述 url 执行 CURL GET,您会得到如下响应。

编辑 cURL 输出

  1. 上述 GET 请求和生成的 302 响应将显示您可以下载的 PDF 文档的位置。 302 响应标头将包含以下内容。

    final Header[] headers = response.getHeaders(HttpHeaders.LOCATION);
    
    final String location = headers[0].getValue();
    

这是一个如下形式的url。

/download/temp/pdfexport-20190924-240919-0526-189/a-filename-for-pdf.pdf?contentType=application/pdf

    上面的
  1. Location 标题包含导出/生成的 PDF 的 url。然后,您可以对该 URL 进行后续 HTTP GET 操作以下载生成的 PDF 文档。 如果您使用 Apache Http 客户端,则需要对后续 GET 请求使用自动重定向处理。
此答案全部归功于 Narcolessico。我只是想添加我必须整理的细节以使其在 Java 中运行。


0
投票
如果我运行第一个curl 调用,我将无法获得正确的下载位置。你能帮我得到你使用的确切的卷曲调用吗?

© www.soinside.com 2019 - 2024. All rights reserved.