Создание закладок в формате PDF с использованием шаблона скорости - PullRequest
0 голосов
/ 28 мая 2019

У меня огромные данные, данные будут использоваться для генерации PDF с использованием скоростного шаблона.У меня есть страница индекса, созданная с использованием файла .vm, который является таблицей.Я должен обеспечить создание закладок со страницы индекса на другие страницы, которые предназначены для.

Я пытался использовать только href в HTML.

index.vm:

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

assembly.vm:

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

Предполагается, что на индексной странице будет ссылка, и при щелчке по ней перейдите на страницу соответствующего контента.

1 Ответ

0 голосов
/ 28 мая 2019

Я столкнулся с той же проблемой при создании PDF-файлов из шаблонов, но я использовал JSP.Это та же логика для каждого движка шаблонов.

Чтобы добиться этого, сделайте запрос на вашем собственном сервере, чтобы получить сгенерированный контент из шаблона в HTML и преобразовать его в PDF с помощью летающая тарелка .

enter image description here

Таким образом, в основном у вас будет

Сервлет, возвращающий сгенерированный шаблон скорости в соответствии с параметрами

(то есть: http://127.0.0.1/getgeneratedpdf)

    dopost etc. ...

Другой сервлет, вызывающий этот первый сервлет с необходимыми параметрами для извлечения сгенерированного содержимого в 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());
}
...