gpt4 book ai didi

java - 使用速度模板生成的 pdf 中的书签

转载 作者:行者123 更新时间:2023-12-02 05:07:50 24 4
gpt4 key购买 nike

我有大量数据,这些数据将用于使用速度模板生成PDF。我使用 .vm 文件生成了索引页,该文件是一个表。我应该提供从索引页到其他页面的书签,这是有意的。

我尝试在 HTML 中仅使用 href。

index.vm:

<table>
<tr>
<td>
1
</td>
<td>
<a href="#go">chapter1</a>
<td>
</tr>
</table>

程序集.vm:

<table>
<tr>
<p1 id="go">assembly1</p>
</tr>
</table>

索引页面中应该有链接,单击它即可转到相应的内容页面。

最佳答案

我在从模板生成 PDF 时遇到了同样的问题,但我使用的是 JSP。每个模板引擎的逻辑都是相同的。

要实现它,请在您自己的服务器上发出请求,从 HTML 模板中获取生成的内容,并使用 flying-saucer 将其转换为 PDF。 .

enter image description here

所以基本上你会有

根据参数返回生成的 Velocity 模板的 servlet

(即:http://127.0.0.1/getgeneratedpdf)

    dopost etc. ...

另一个 servlet 使用所需的参数调用第一个 servlet,以获取生成的 HTML 内容

   URLConnection connection = new URL(urlOfTheServletAbove).openConnection();
connection.setDoOutput(true); // POST
connection.setRequestProperty("Accept-Charset", "UTF-8");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
try (OutputStream output = connection.getOutputStream()) {
// parameters is encoded query string
output.write(parameters.getBytes(StandardCharsets.UTF_8));
}
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder sb = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null) { sb.append(inputLine); }
in.close();

基于飞碟的PDF生成器

import org.xhtmlrenderer.pdf.ITextRenderer;
// ...
private static final String TMP_DIR = System.getProperty("java.io.tmpdir");
// ...
File tempPdf = new File(TMP_DIR+tempPdfName);
if (!tempPdf.exists()) { tempPdf.createNewFile(); }
FileOutputStream fos = new FileOutputStream(tempPdf);
new ITextRenderer() {{
setDocumentFromString(sb.toString());
layout();
createPDF(fos);
}};
fos.close();
// ...

然后将 PDF 写入响应

void writePDFContentToResponse(File pdf, HttpServletResponse response) throws IOException {
InputStream fis = new FileInputStream(pdf);
String mimeType = getServlet().getServletContext().getMimeType(pdf.getAbsolutePath());
response.setContentType(mimeType != null ? mimeType : "application/octet-stream");
response.setContentLength((int) pdf.length());
response.setHeader("Content-Disposition", "attachment; filename=yourPDFName.pdf"); // or +pdf.getName();
ServletOutputStream os = response.getOutputStream();
byte[] bufferData = new byte[1024];
int read = 0;
while((read = fis.read(bufferData)) != -1) { os.write(bufferData, 0, read); }
os.flush();
os.close();
fis.close();
response.flushBuffer();
Files.delete(pdf.toPath());
}

关于java - 使用速度模板生成的 pdf 中的书签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56340591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com