前端用vue写页面,并将html和css传给后端,后端用itext将页面转成PDF,请分别写出前端和后端的详细实现代码并注释
时间: 2024-03-18 21:40:59 浏览: 132
Vue网页html转换PDF(最低兼容ie10)的思路详解
好的,以下是前端和后端实现将页面转成PDF的详细代码示例。这里我们假设前端使用Vue框架,后端使用Java语言和Spring框架。
前端代码:
```vue
<template>
<div id="app">
<h1>Hello, World!</h1>
<p>This is a sample Vue page.</p>
</div>
</template>
<script>
import axios from 'axios';
export default {
name: 'App',
mounted() {
// 获取页面HTML内容
const htmlContent = document.documentElement.outerHTML;
// 获取页面CSS内容
const styles = document.getElementsByTagName("style");
let cssContent = "";
for (let i = 0; i < styles.length; i++) {
cssContent += styles[i].innerHTML;
}
// 将HTML和CSS内容发送给后端
axios.post('/pdf', {
html: htmlContent,
css: cssContent
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
}
</script>
```
在这个示例中,我们在Vue的`mounted()`钩子函数中获取页面的HTML和CSS内容,并使用axios将这些内容发送给后端。请注意,这里的`/pdf`是后端的API接口地址。
后端代码:
```java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
@Controller
public class PdfController {
@PostMapping("/pdf")
@ResponseBody
public void generatePdf(@RequestBody PdfRequest request, HttpServletResponse response) throws IOException {
try {
// 创建PDF文档
Document document = new Document(PageSize.A4);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, baos);
// 打开文档
document.open();
// 添加HTML内容到PDF文档
InputStream isHtml = new ByteArrayInputStream(request.getHtml().getBytes());
InputStream isCss = new ByteArrayInputStream(request.getCss().getBytes());
XMLWorkerHelper.getInstance().parseXHtml(writer, document, isHtml, isCss);
// 关闭文档
document.close();
// 设置HTTP响应头
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"sample.pdf\"");
// 写入响应内容
response.getOutputStream().write(baos.toByteArray());
response.flushBuffer();
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static class PdfRequest {
private String html;
private String css;
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
public String getCss() {
return css;
}
public void setCss(String css) {
this.css = css;
}
}
}
```
在这个示例中,我们使用Spring框架创建了一个Controller,其中包含了一个API接口`/pdf`。当接收到前端发送的HTML和CSS内容后,我们使用iText库将其转换为PDF,并将生成的PDF文件作为HTTP响应返回给前端。
请注意,这里的代码仅供参考,您可能需要根据您的具体需求进行修改和扩展。例如,您可能需要从多个CSS文件中获取样式,或者您可能需要在发送数据之前对HTML和CSS进行一些处理或过滤。
阅读全文