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

5

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

可以使用以下URL进行下载:

  • http://<Confluence服务器>/confluence/spaces/flyingpdf/pdfpageexport.action?pageId=<页面ID>

当输入此URL时,它可以正常工作。

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

您有没有办法向wget命令提供Confluence凭据?或者其他下载PDF页面的解决方案?

3个回答

4
如果您使用的是Confluence 5.5之前的Confluence Server,那么您很幸运!Confluence有一个API来处理这个问题,请参见他们的文档
更新:如果您使用的是Confluence Server 5.5或更高版本,则默认情况下不会启用此API。请参见Confluence管理 > 更多配置以启用XML-RPC和SOAP API。(感谢@fatpanther指出)
新的REST API不支持此功能,请参见REST API文档
您可以尝试使用Confluence命令行界面导出为PDF。

实际上,在版本> 5.5中,XML-RPC和SOAP API已被弃用,但仍可供使用。您必须先启用它们:(Confluence管理>进一步配置) - fatpanther
1
谢谢@fatpanther,我已经更新了答案,包括您提供的有关启用XML-RPC / SOAP API的部分。 - Brandon Haugen

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)执行HTTP GET请求到Confluence服务器。
1. 我使用Chrome浏览器导航到我想要导出为PDF的Confluence页面。我展开工具菜单,在“导出为PDF”上右键单击,然后点击“检查”。这将显示该菜单选项的底层HTML元素,其中包含用于启动PDF导出操作的链接。 检查元素以查找URL 2. 元素检查显示PDF导出操作的相对链接如下。 HTML源代码
  1. 如果您从Java执行HTTP GET到https://your-confluence-server-hostname/the-relative-link-from-step-2,您需要禁用重定向处理。这就是Narcolessico的答案让我感到困惑的地方,因为我从cURL和Java中得到了不同的响应。当我意识到cURL操作返回302响应并且Apache Http客户端自动处理它时,我找到了一种方法来禁用自动重定向处理,以便我可以捕获位置标头信息。

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

    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 使用 HTTPS,则可能需要处理另一个问题。

顺便提一下,如果您对上述 URL 执行 CURL GET,则会收到以下响应。

已编辑的 cURL 输出

  1. The above GET request and resulting 302 response, will reveal the location of the PDF document that you can then download. The 302 response headers will contain the following.

    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. 位置头部包含导出/生成的PDF的URL。然后,您可以对该URL进行后续的HTTP GET请求以下载生成的PDF文档。 如果您使用的是Apache Http客户端,则需要为此后续GET请求使用自动重定向处理。

所有信用归Narcolessico所有。我只是想添加我需要解决的细节,以使其从Java正常工作。


你有一份可用的Python脚本,试图以HTML或PDF格式下载页面吗? - user3754136

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接