如何使用ConvertAPI将HTML字符串转换为PDF(无需物理文件)
Java实现ConvertAPI v2 HTML转PDF的POST请求示例(已解决)
问题背景
此前我通过http://do.convertapi.com/Web2Pdf接口用GET请求转换HTML到PDF,但该API已停止工作,现在需要迁移到ConvertAPI v2的https://v2.convertapi.com/html/to/pdf端点,却找不到合适的Java请求示例。
已验证的完整实现代码
经过调试,我已经成功完成了功能迁移,下面是完整的Java代码,包含请求配置、HTML内容传递、响应处理以及生成PDF附件的逻辑:
private static final String WEB2PDF_API_URL = "https://v2.convertapi.com/html/to/pdf"; private static final String WEB2PDF_SECRET = "secret-here"; public void convertHtmlToPdf(String htmlContent) throws IOException { // 构建API请求URL,包含密钥和PDF布局参数 URL apiUrl = new URL(WEB2PDF_API_URL + "?secret=" + WEB2PDF_SECRET + "&download=attachment&PageOrientation=landscape&MarginLeft=0&MarginRight=0&MarginTop=0&MarginBottom=0"); HttpURLConnection connection = null; ByteArrayOutputStream buffer = null; try { connection = (HttpURLConnection) apiUrl.openConnection(); // 设置必要的请求头 connection.setRequestProperty("Content-Type", "application/octet-stream"); connection.setRequestMethod("POST"); connection.setConnectTimeout(60000); connection.setReadTimeout(60000); connection.setDoOutput(true); // 向API发送HTML内容 OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write(htmlContent); writer.flush(); writer.close(); // 打印响应状态便于调试 String responseMessage = connection.getResponseMessage(); System.out.println("Response Message: " + responseMessage); int statusCode = connection.getResponseCode(); System.out.println("Status Code: " + statusCode); if (statusCode == HttpURLConnection.HTTP_OK) { System.out.println("HTML转PDF请求成功"); // 读取API返回的PDF字节流 InputStream is = connection.getInputStream(); buffer = new ByteArrayOutputStream(); int nRead; byte[] data = new byte[16384]; while ((nRead = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, nRead); } buffer.flush(); byte[] pdfBytes = buffer.toByteArray(); // 可选:将PDF转换为邮件附件(不需要可直接移除这部分逻辑) MimeMultipart content = new MimeMultipart(); MimeBodyPart attachment = new MimeBodyPart(); InputStream pdfStream = new ByteArrayInputStream(pdfBytes); // 生成随机文件名避免重复 String fileName = "document-" + Long.toHexString(Double.doubleToLongBits(Math.random())) + ".pdf"; attachment.setFileName(fileName); attachment.setContent(pdfStream, "application/pdf"); content.addBodyPart(attachment); // 后续可根据需求处理content,比如发送邮件、存储到本地等 } else { System.out.println("转换请求失败,状态码:" + statusCode); // 可添加错误响应的详细处理逻辑 } } finally { // 关闭资源避免内存泄漏 if (buffer != null) { buffer.close(); } if (connection != null) { connection.disconnect(); } } }
关键细节说明
- 采用POST请求传递HTML内容,相比GET更适合处理较长的HTML字符串,避免URL长度限制问题
- URL参数中配置了PDF的核心布局:横向(
landscape)、无边距,可根据实际需求调整这些参数 - 请求头设置
Content-Type为application/octet-stream,确保HTML内容能被API正确解析 - 响应处理部分将API返回的PDF流转换为字节数组,方便后续存储、下载或作为附件使用
内容的提问来源于stack exchange,提问作者DFB
相关产品推荐
相关产品推荐

