Закладка в pdf, созданная с использованием шаблона скорости

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

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

индекс.вм:

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

сборка.вм:

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

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

Вы хотите сгенерировать эти шаблоны .vm в PDF?

Paul 28.05.2019 12:55

@Paul.F-G Да, я использую шаблоны .vm для создания PDF

abcd 28.05.2019 12:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
869
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Так что в основном у вас будет

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

(т.е.: 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());
}
Ответ принят как подходящий

После того, как PDF-файл был сгенерирован с использованием itext и файла .vm, при создании сохраните описание с номером страницы на карте, это было достигнуто с помощью следующего кода

HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("Title", "INDEX");
    map.put("Action", "GoTo");
    map.put("Page", String.format("%d Fit", 8));
    ArrayList<HashMap<String, Object>> kids = new ArrayList<HashMap<String,Object>>();

    for(BookMark book : BookMarks) {
        HashMap<String, Object> kid = new HashMap<String, Object>();
        kid.put("Title", book.getDescription());
        kid.put("Action", "GoTo");
        kid.put("Page", String.format("%d Fit", book.getPageNumber()));

        ArrayList<HashMap<String, Object>> leafs = new ArrayList<HashMap<String,Object>>();
        for(BookMark books : book.getLeaf()) {
            HashMap<String, Object> leaf = new HashMap<String, Object>();
            leaf.put("Title", books.getDescription());
            leaf.put("Action", "GoTo");
            leaf.put("Page", String.format("%d Fit", books.getPageNumber()));
            leafs.add(leaf);
        }
        kid.put("Kids", leafs);
        kids.add(kid);
    }

    map.put("Kids", kids);
    ArrayList<HashMap<String, Object>> outlines = new ArrayList<HashMap<String,Object>>();
    outlines.add(map);
    PdfReader reader = new PdfReader(env.getProperty("path.generated.pdf").concat(fileName));
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(env.getProperty("path.generated.pdf").concat(catalogInfo.getCatalogName().trim().concat("raw1")).concat(".pdf")));
    stamper.setOutlines(outlines);
    stamper.setFullCompression();
    stamper.close();
    reader.close();
    File file = new File(env.getProperty("path.generated.pdf").concat(fileName)); 
    file.delete();

Другие вопросы по теме