Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как web-страницу легко превратить в PDF?

Anna | 2.06.2014 | нет комментариев
Для меня было дюже невзначай то, что в хабе по Java фактически нет информации по работе с PDF документами, следственно я, из личного навыка, хочу на примере сервлета показать как легко дозволено всякую web-страницу превратить в PDF документ.

Преамбула:

Напишем примитивный сервлет, тот, что будет брать указанную нами web-страницу по HTTP протоколу и генерировать на её основе полновесный PDF документ.

Используемые библиотеки:
  • Flying Saucer PDF — основная библиотека, которая поможет сделать нам PDF документ из HTML/CSS
  • iText — библиотека, которая включена в состав той, что описана выше, но я не мог не включить ее в список библиотек, т.к. именно на основе неё будет генерироваться PDF документ
  • HTML Cleaner — библиотека, которая будет приводить наш HTML код в порядок
Изложения библиотек для Maven конфигурации (pom.xml)

        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>flying-saucer-pdf</artifactId>
            <version>9.0.4</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.htmlcleaner</groupId>
            <artifactId>htmlcleaner</artifactId>
            <version>2.6.1</version>
        </dependency>
Образование страницы:

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

Разглядим макет:

page.jsp

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%!
    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
%>
<html>
<head>
    <title>Пример</title>
    <style>
        @font-face {
            font-family: "HabraFont";
            src: url(http://localhost:8080/resources/fonts/tahoma.ttf);
            -fs-pdf-font-embed: embed;
            -fs-pdf-font-encoding: Identity-H;
        }

        @page {
            margin: 0px;
            padding: 0px;
            size: A4 portrait;
        }

        @media print {
            .new_page {
                page-break-after: always;
            }
        }

        body {
            background-image: url(http://localhost:8080/resources/images/background.png);
        }

        body *{
            padding: 0;
            margin: 0;
        }

        * {
            font-family: HabraFont;
        }

        #block {
            width: 90%;
            margin: auto;
            background-color: white;
            border: dashed #dbdbdb 1px;
        }

        #logo {
            margin-top: 5px;
            width: 100%;
            text-align: center;
            border-bottom: dashed #dbdbdb 1px;
        }

        #content {
            padding-left: 10px;
        }

    </style>
</head>
<body>
<div id="block">
    <div id="logo"><img src="http://localhost:8080/resources/images/habra-logo.png"></div>
    <div id="content">
        Здравствуй, прогр! Нынешнее время: <%=sdf.format(new Date())%>
        <div> </div>
        Новая страница!
    </div>
</div>

</body>
</html>

Тут хочу остановиться на нескольких моментах. Для начала самое значимое: все пути обязаны быть безусловными! Картинки, жанры, адреса шрифтов и др., на всё обязаны быть прописаны безусловные пути. А сейчас пройдемся по CSS правилам (то, что начинается с символа @).
@ font-face — это правило, которое скажет нашему PDF генератору какой необходимо взять шрифт, и откуда. Задача в том, что библиотека, которая будет генерировать PDF документ не содержит шрифтов, включающих в себя кириллицу. Именно следственно таким образом придется определять ВСЕ шр= new StringBuilder(); String line; while (null != (line = in.readLine())) { sb.append(line).append(“n”); } return sb.toString().trim(); } @Override public String getServletInfo() { return “The servlet that generate and returns pdf file”; } }

Кстати, вовсе не непременно писать для этих целей сервлет, Вы можете перенести логику этого сервлета хоть в консольное приложение, которое будет сберегать PDF документы в файлы. Как Вы могли подметить, в сервлете не необходимо ничего настраивать, менять, дополнять, и т.д. (ну за исключением пути до страницы и, допустимо, кодировки), соответственно каждая работа по подготовке PDF документа дюже примитивна и происходит экстраординарно во вьюшке.

В финальном результате у Вас должен получиться приблизительно такой PDF документ: db.tt/HGMKTqYV
Я немножко дополнил свой документ информацией (распарсил основную страницу Програ) и у меня получился такой вот документ:db.tt/WKIOUg96

Ссылка на исходники: db.tt/FbP6vwQ6

P.S. В тезисе, на основе этого примера дозволено написать целый сервис, тот, что будет по любому адресу страницы создавать PDF документ. Исключительное, что будет нужно сделать — это привести HTML код страницы в соответствие с нашими правилами, т.е. в первую очередь необходимо будет переписать все относительные пути на безусловные (благо это делается не трудно), и в соответствии с какой-то логикой задать размеры документа.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB