Онлайн конвертер web в pdf с оглавлением. Как web-страницу легко превратить в PDF? С помощью спец

Главная / Технологии
  • Java ,
  • PDF
    • Tutorial

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

    Преамбула:
    Напишем простой сервлет, который будет брать указанную нами web-страницу по HTTP протоколу и генерировать на её основе полноценный PDF документ.
    Используемые библиотеки:
    • Flying Saucer PDF - основная библиотека, которая поможет создать нам PDF документ из HTML/CSS
    • iText - библиотека, которая включена в состав той, что описана выше, но я не мог не включить ее в список библиотек, т.к. именно на основе неё будет генерироваться PDF документ
    • HTML Cleaner - библиотека, которая будет приводить наш HTML код в порядок

    Описания библиотек для Maven конфигурации (pom.xml)

    org.xhtmlrenderer flying-saucer-pdf 9.0.4 net.sourceforge.htmlcleaner htmlcleaner 2.6.1

    Формирование страницы:
    Одним из самый важных моментов является формирование страницы. Дело в том, что именно из самой страницы, посредством 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"); %> Пример

    Привет, хабр! Текущее время: <%=sdf.format(new Date())%>
    Новая страница!


    Здесь хочу остановиться на нескольких моментах. Для начала самое важное: все пути должны быть абсолютными ! Картинки, стили, адреса шрифтов и др., на всё должны быть прописаны абсолютные пути. А теперь пройдемся по CSS правилам (то, что начинается с символа @).
    @ font-face - это правило, которое скажет нашему PDF генератору какой нужно взять шрифт, и откуда. Проблема в том, что библиотека, которая будет генерировать PDF документ не содержит шрифтов, включающих в себя кириллицу. Именно поэтому таким образом придется определять ВСЕ шрифты, которые используются в Вашей странице, пусть это будут даже стандартные шрифты: Arial, Verdana, Tahoma, и пр., в противном случае Вы рискуете не увидеть кириллицу в Вашем документе.
    Обратите внимание на такие свойства как "-fs-pdf-font-embed: embed;" и "-fs-pdf-font-encoding: Identity-H;", эти свойства необходимы, их просто не забывайте добавлять.
    @ page - это правило, которое задает отступы для PDF документа, ну и его размер. Здесь хотелось бы отметить, что если Вы укажите размер страницы A3 (а как показывает практика, это часто необходимо, т.к. страница не помещается в документ по ширине), то это не значит, что пользователю необходимо будет распечатывать документ (при желании) в формате A3, скорее просто весь контент будет пропорционально уменьшен/увеличен до желаемого (чаще A4). Т.е. относитесь к значению свойства size скептически, но знайте, что оно может сыграть для Вас ключевую роль.
    @ media - правило, позволяющее создавать CSS классы для определенного типа устройств, в нашем случае это «print». Внутри этого правила мы создали класс, после которого наш генератор PDF документа создаст новую страницу.
    Сервлет:
    Теперь напишем сервлет, который будет возвращать нам сгенерированный PDF документ:

    PdfServlet.java

    package ru.habrahabr.web_to_pdf.servlets; import org.htmlcleaner.CleanerProperties; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.PrettyXmlSerializer; import org.htmlcleaner.TagNode; import org.xhtmlrenderer.pdf.ITextRenderer; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** * Date: 31.03.2014 * Time: 9:33 * * @author Ruslan Molchanov ([email protected]) */ public class PdfServlet extends HttpServlet { private static final String PAGE_TO_PARSE = "http://localhost:8080/page.jsp"; private static final String CHARSET = "UTF-8"; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { resp.setContentType("application/pdf"); byte pdfDoc = performPdfDocument(PAGE_TO_PARSE); resp.setContentLength(pdfDoc.length); resp.getOutputStream().write(pdfDoc); } catch (Exception ex) { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.write("Something wrong

    "); ex.printStackTrace(out); ex.printStackTrace(); } } /** * Метод, подготавливащий PDF документ. * @param path путь до страницы * @return PDF документ * @throws Exception */ private byte performPdfDocument(String path) throws Exception { // Получаем HTML код страницы String html = getHtml(path); // Буффер, в котором будет лежать отформатированный HTML код ByteArrayOutputStream out = new ByteArrayOutputStream(); // Форматирование HTML кода /* эта процедура не обязательна, но я настоятельно рекомендую использовать этот блок */ HtmlCleaner cleaner = new HtmlCleaner(); CleanerProperties props = cleaner.getProperties(); props.setCharset(CHARSET); TagNode node = cleaner.clean(html); new PrettyXmlSerializer(props).writeToStream(node, out); // Создаем PDF из подготовленного HTML кода ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(new String(out.toByteArray(), CHARSET)); renderer.layout(); /* заметьте, на этом этапе Вы можете записать PDF документ, скажем, в файл * но раз мы пишем сервлет, который будет возвращать PDF документ, * нам нужен массив байт, который мы отдадим пользователю */ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); renderer.createPDF(outputStream); // Завершаем работу renderer.finishPDF(); out.flush(); out.close(); byte result = outputStream.toByteArray(); outputStream.close(); return result; } private String getHtml(String path) throws IOException { URLConnection urlConnection = new URL(path).openConnection(); ((HttpURLConnection) urlConnection).setInstanceFollowRedirects(true); HttpURLConnection.setFollowRedirects(true); boolean redirect = false; // normally, 3xx is redirect int status = ((HttpURLConnection) urlConnection).getResponseCode(); if (HttpURLConnection.HTTP_OK != status && (HttpURLConnection.HTTP_MOVED_TEMP == status || HttpURLConnection.HTTP_MOVED_PERM == status || HttpURLConnection.HTTP_SEE_OTHER == status)) { redirect = true; } if (redirect) { // get redirect url from "location" header field String newUrl = urlConnection.getHeaderField("Location"); // open the new connnection again urlConnection = new URL(newUrl).openConnection(); } urlConnection.setConnectTimeout(30000); urlConnection.setReadTimeout(30000); BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), CHARSET)); StringBuilder sb = 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 документ.

    Всем доброго времени!

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

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

    В этой статье рассмотрю несколько способов, как это можно быстро и легко сделать. Собственно, приступим к делу...

    С помощью печати в браузере

    1) Какой бы не был у вас браузер (Chrome, Opera, Edge, Firefox и др.), нажмите сочетание кнопок Ctrl+P (это сочетание означает распечатку страницы). Также эта функция доступна в меню браузеров.

    2) Далее измените принтер по умолчанию на "Сохранить как PDF" или "Microsoft Print to PDF" (в зависимости от вашего браузера и ОС - у вас могут быть доступны разные варианты: как оба, так и всего один из них). См. пару скриншотов ниже.

    3) Теперь задайте основные настройки: кол-во сохраняемых страниц, раскладку страницы, поля, цветность, колонтитулы и пр. После нажмите кнопку "Печатать".

    Собственно, на этом задача выполнена. Теперь полученный PDF можно открыть в Word, Adobe PDF Reader, и сотнях других программ, поддерживающих данный формат.

    С помощью спец. расширений

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

    Выделить я бы хотел одно очень интересное дополнение - PDF MAGE.

    PDF Mage

    Небольшое дополнение для Firefox, Opera, Chrome, позволяющие в 1 клик мышкой сохранить веб-страницу полностью на жесткий диск!

    Отмечу, что после нажатия по значку PDF Mage - текущая страничка просто скачивается в формате PDF к вам в папку загрузки. Удобнее придумать просто нельзя...

    Покажу на примере.

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

    Буквально через мгновение, браузер сам автоматически начнет загружать файл в формате PDF. Собственно, делается все без лишних телодвижений, быстро и удобно!

    С помощью онлайн сервисов

    В сети также есть множество интернет-сервисов, позволяющих быстро сохранить любые странички в сети в PDF. Суть работы примерно следующая: вы вставляете в спец. строку URL-адрес странички, которую вам нужно сохранить.

    Далее жмете кнопку генерации PDF файла. Через некоторое время получаете ссылку на загрузку своего PDF. Пользоваться, конечно, можно, но на мой скромный взгляд - всё это утомительно и годится для временного использования. Например, у вас есть "проблемы" с браузером или Windows, попалась какая-то "странная" страница, которая не хочет сохраняться предыдущими способами.

    И так, самые популярные из сервисов подобного рода:

    1. - простой и удобный сервис на английском. На сайте есть спец. строка, куда вставляете URL-адрес, а рядом кнопка генерации. На выходе загружаете уже готовый PDF к себе на жесткий диск.
    2. - еще один зарубежный сервис, работает аналогично.
    3. - очень популярный сервис, с его помощью уже сохранено более 5 000 000 страниц по всему Миру! Здесь помимо всего прочего, можно загрузить дополнения для браузера (чтобы не посещать каждый раз сайт, когда нужно сохранить страницу).
    4. - довольно простой и удобный сервис. Минимум лишней информации на сайте.

    На этом у меня всё, всем удачи!


    Для чего нужно сохранять страницы интернет сайтов? Ну, возможно вы хотите прочитать информацию в режиме офлайн или же сделать какие-то наблюдения над сайтом или же вы это хотите сделать с другой целью. Мне лично все равно, для чего вам это нужно, а просто расскажу, как это сделать в разных браузерах. И так, как же сохранить страницу сайта в формате PDF в браузерах Chrome, Opera, Yandex, Firefox?

    Пожалуй, начнем с браузера Chrome .

    Для начала вам необходимо найти страницу, которая вас интересует. У меня на примере будет автомобильный сайт ax4.ru .

    В правом верхнем углу нажимаем что-то на подобии сэндвича. В появившемся меню нажимаем «Печать ».

    Далее вы увидите, что по умолчанию стоит название принтера, который у вас установлен или другой, который запрограммирован браузером. Нам нужно его изменить, нажав на соответствующую кнопку «Изменить ».

    Когда нажмем «Изменить », появится меню, в котором нужно выбрать пункт «Сохранить как PDF ».

    После чего, слева, название принтера поменяется на «сохранить как PDF ». Остаётся лишь нажать кнопку «Сохранить ».

    Выбираем место сохранения (у меня это Рабочий стол).


    Всё, теперь можно открывать сохранившийся файл PDF. Может показаться, что выглядит не очень, но копировать текст с него можно очень просто.

    Теперь я открываю файл PDF через Foxit Reader. Вы, как я упоминал ранее, можете использовать другую программу.
    Вот и всё, не очень симпатично, но суть понятна. Вы можете делать файл PDF из любой веб-страницы.

    Для этого я зайду на новостной сайт nz1.ru и выберу какую-нибудь новость.

    Как вы уже поняли, процедура во всех браузерах похожа. Нажимаем на подобия сэндвича в правом верхнем углу, затем «Дополнительно » и «Печать ».

    Сохраняем в PDF.

    Затем выбираем место сохранения. Например, Рабочий стол.

    Открываем файл через любую программу, которая читает формат PDF, пользуемся.

    Покажу на примере сайта с прикольными картинками prikolnie-kartinki.ru .

    В браузере Mozilla Firefox немножко все происходит по-другому. Нажимаем на сэндвич в правом верхнем углу экрана и выбираем «Печать ».

    © 2024 ermake.ru -- Про ремонт ПК - Информационный портал