1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wuxue107-bookjs-eazy

Клонировать/Скачать
README.md 32 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 19:03 de87f0e

1000,

// Простой плагин для нумерации страниц, опционально (по умолчанию не включён), указанные опции являются значениями по умолчанию при включении.
simplePageNum: {
    // С какой страницы начинать нумерацию страниц, значение по умолчанию: 0 означает начало с первой страницы. Если вы не уверены в начальной странице, вы также можете указать селектор CSS, например: ".first_page", что означает начало нумерации со страницы, содержащей узел селектора.
    pageBegin: 0,
    // На какой странице заканчивать нумерацию, значение по умолчанию: -1 означает окончание на последней странице. Если вы не уверены в конечной странице, вы можете также использовать селектор CSS, такой как: ".end_page", чтобы указать страницу, на которой заканчивается нумерация.
    pageEnd: -1,
    // Компонент страницы, опциональный
    pendant: '<div class="page-num-simple"><span style="">$' + '{PAGE} / $' + '{TOTAL_PAGE}</span></div>',
},

// Плагин каталога/закладки, опционально (по умолчанию не включён), указанные параметры являются значениями по умолчанию при включении.
simpleCatalog: {
    // Текущая версия, если требуется создать PDF закладки, toolBar.serverPrint.wkHtmlToPdf должен быть истинным
    // Не изменяйте titlesSelector, используйте h1-h6 для создания закладок.
    titlesSelector: 'h1,h2,h3,h4,h5,h6', // Опционально, используется как селектор заголовков каталогов, упорядоченных по уровню каталога.

    /** Параметры, связанные с каталогом **/
    showCatalog: true, // Опционально, следует ли вставлять каталог на страницу, по умолчанию каталог вставляется на страницу.
    header: '<div class="catalog-title">Оглавление</div>', // Опционально, часть заголовка страницы, можно добавить всё, что вы хотите.
    itemFillChar: '…', // Опционально, символ заполнения элементов каталога, "" пустая строка, без заполнения, при использовании пользовательской функции makeItem этот параметр будет проигнорирован.
    positionSelector: '.nop-page-item-pagenum-1', //Опционально, позиция вставки каталога находится перед соответствующей страницей, по умолчанию — перед первой пронумерованной страницей.
    // Опционально, пользовательский элемент каталога.
    makeItem: function(itemEl, itemInfo) {
        /**
         * @var itemEl jQuery Element
         * @var object itemInfo PS: {title, pageNum, level,linkId}
        **/
        return '<div>Пользовательский элемент каталога HTML-контент, созданный в соответствии с itemInfo.</div>';
    },

    /** Боковая панель (PDF закладки) связанные параметры **/
    showSlide: true, // Опционально, показывать ли боковую панель, каталог навигации, кнопки панели инструментов упорядочены index: 200, недействительно, когда bookConfig.toolBar имеет значение false.
    slideOn: false, // Опционально, состояние открытия боковой панели навигации по каталогу, по умолчанию открыто.
    slideHeader: '<div class="title">Каталог</div>', // Опционально, заголовок боковой панели.
    slideClassName: '', // Опционально, класс боковой панели.
    slidePosition: 'left', // Опционально, положение left или right.
    slideMakeContent: null, // Пользовательская функция обработки содержимого боковой панели, null означает использование содержимого каталога для заполнения по умолчанию.
},

// Панель инструментов, опциональная (по умолчанию включена), object|false, false не отображает панель инструментов, указанные параметры являются значениями по умолчанию при включении.
toolBar: {
    // Кнопка веб-печати, опционально, значение по умолчанию true, индекс кнопки: 100.
    webPrint: true,

    /**
     * Кнопка сохранения HTML, опционально, bool|object, значение по умолчанию false: отключить сохранение HTML, true: включить и использовать значения по умолчанию, object: использовать пользовательские настройки для сохранения.
     * Значение по умолчанию для true равно object: serverPrint: { serverUrl: '/' },
     * Для использования serverPrint сервер должен иметь доступ к вашей веб-странице. Веб-страница не должна использовать авторизацию на основе состояния входа, рекомендуется передавать временные разрешения через URL-параметры.
     * Если вы используете официальный сервер для печати, вам необходимо убедиться, что ваша веб-страница, созданная с помощью bookjs-eazy, доступна в Интернете.
     *
     * serverPrint: {
     *     // Опциональный, адрес сервера печати, индекс кнопки: 400
     *     serverUrl: '/',
     *
     *     // Опционально, true использует wkHtmlPdf для создания, false: по умолчанию использует chrome headless
     *     // **Примечание**: wkhtmltopdf не поддерживает es6, некоторые новые функции веб-сайтов отсутствуют, но преимущество заключается в том, что он может создавать каталоги PDF.
     *     // Для лучшей отладки проблем: пожалуйста, загрузите QtWeb Browser, его ядро такое же, как у wkhtmltopdf.
     *     // Меню->Инструменты->Включить веб-инспектор, щелкните правой кнопкой мыши содержимое страницы и выберите «Проверить», чтобы открыть панель инструментов отладки.
     *     // Таким образом, вы можете обнаружить различные проблемы совместимости.
     *     // В браузере QtWeb по умолчанию используется режим печати без отображения интервалов между страницами и панели инструментов.
     *     // Ссылка для скачивания: http://www.qtweb.net/download.html
     *     wkHtmlToPdf: false,
     *
     *     // Опциональное, имя файла сохранения, значение по умолчанию document.title + '.pdf'
     *     fileName: 'output.pdf',
     *     // Опциональные параметры печати
     *     params: {
     *         // Время ожидания печати
     *         timeout: 30000,
     *         // Задержка после завершения рендеринга страницы перед печатью
     *         delay: 1000,
     *     },
     *     // Опциональная, настраиваемая загрузка. Может использоваться при смешанной загрузке приложений.
     *     save: function(pdfUrl, serverPrintOption){
     *         
     *     }
     * }
     */
    serverPrint: false,

    buttons: [
        // Здесь вы можете настроить кнопки панели инструментов
        // {
        //     id: 'cloudPrint',
        //     index: 1, // Индекс позиции кнопки, чем меньше значение, тем раньше отображается, значение индекса системных кнопок см. в описании каждой конфигурации.
        //     icon: 'https://xxxx.../aa.png'
        //     onClick: function(){
console.log("...do some thing"); }
// }
],
className: '', // 额外自定义的 class 属性
position: 'right', // 位置:right、left
}
}
</script>

PDF 内容设计 (约定页面内容分页方式)

  1. Определить узел с id = «content-box», в который будут вставляться данные.
  2. Каждый дочерний узел первого уровня внутри content-box должен иметь атрибут data-op-type, который определяет способ вставки содержимого в документ.
  3. Пример:
<body>
    <div id="content-box">
        <p data-op-type="text">Hello World!</p>
    </div>
</body>
  1. Дочерние узлы block и text могут быть вложены в контейнеры типа mix-box, table, block-box или text-box. Другие типы не поддерживают взаимное вложение.
  2. Для каждого типа есть свои особенности использования, которые описаны ниже.
  • block: блок, неразделимый (по умолчанию).

    • Если места на странице достаточно, содержимое будет вставлено целиком. Если места недостаточно, будет создана новая страница, и содержимое будет перенесено туда.
    • Внимание: здесь блок означает только то, что содержимое не переносится на другую страницу. Это не связано с display в CSS.
    • Пример: пример блока.
    • Используется в следующих позициях:
      • #content-box > дочерние узлы первого уровня;
      • [data-op-type=mix-box] .nop-fill-box > узлы первого уровня контейнера mix-box;
      • [data-op-type=table] tbody td > ячейки таблицы.
  • text: текст, разделимый на разные страницы.

    • Текст автоматически разделяется на страницы, а содержимое узла напрямую содержит текст. (Внутренний узел может содержать только текст, если он содержит дочерние узлы, они будут удалены.)
    • Пример: пример текста.
    • Используется в следующих позициях:
      • #content-box > дочерние узлы первого уровня;
      • [data-op-type=mix-box] .nop-fill-box > узлы первого уровня контейнера mix-box;
      • [data-op-type=table] tbody td > ячейки таблицы первого уровня.
  • new-page: новая страница, контролируется вручную.

    • Содержимое после этого узла будет начинаться с новой страницы.
    • Пример: пример новой страницы.
    • Используется в следующих позициях:
      • #content-box > дочерние узлы первого уровня;
      • [data-op-type=mix-box] .nop-fill-box > узлы первого уровня контейнера mix-box;
      • [data-op-type=table] tbody > tr узлы таблицы (в отличие от других позиций, помеченный tr узел будет сохранён и не будет удалён со страницы).
  • pendants: элементы страницы, фиксированные относительно положения страницы (верхняя часть страницы, нижняя часть страницы и т. д.).

    • Внутренние узлы pendant будут автоматически помечены классом nop-page-pendants, и они будут отображаться после определения и до следующего элемента pendant.
    • Элементы nop-page-pendants имеют свойство position: absolute в CSS, которое фиксирует их положение относительно страницы.
    • При разработке страницы необходимо установить свойства left, right, top, bottom, width и height для элементов pendant, чтобы контролировать их положение и размер.
    • Пример: пример элемента.
    • Используется в следующей позиции:
      • #content-box > дочерние узлы первого уровня.
  • Контейнеры (mix-box, table, block-box и text-box): могут быть разделены и содержат стили макета.

    • Контейнеры включают mix-box, table, block-box и text-box. Подробности см. в соответствующих разделах.

    • Обратите внимание: не ограничивайте высоту контейнеров (например, height или max-height), так как это может повлиять на обнаружение переполнения и привести к неожиданным результатам.

    • mix-box: смешанный контейнер (обычно используется).

      • Контейнер mix-box может содержать несколько элементов [data-op-type="text"] и [data-op-type="block"].

      • Когда содержимое выходит за пределы одной страницы, оно автоматически разделяется по правилам text/block и переносится на следующую страницу, при этом копируется внешний узел, содержащий контейнер.

      • Пример: см. пример смешанного контейнера.

      • Используется в позиции #content-box > дочерних узлов первого уровня.

      • table: таблица, также особый вид контейнера.

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

      • В ячейках таблицы td можно использовать элементы [data-op-type="text"] или [data-op-type="block"] в качестве прямых дочерних элементов.

      • Используйте в позиции #content-box > дочерних узлов первого уровня. Дизайн: связанные детали

  • Шрифт:

    • Если PDF генерируется на сервере, рекомендуется предварительно установить используемые шрифты.
    • В случае запуска через Docker, шрифты можно разместить в папке ./dist/fonts. Они будут автоматически загружаться при запуске Docker.
    • Чтобы ускорить создание скриншотов или генерацию PDF, можно использовать оригинальные имена шрифтов вместо сетевых псевдонимов. Пример кода:
<style>
    @font-face {
        font-family: YH;
        src: url(./fonts/msyh.ttf);
        font-weight: 400;
        font-style: normal
    }

    body {
        font-family: "Microsoft YaHei", YH, sans-serif;
        font-weight: normal;
    }
</style>
  • Событие перед завершением рендеринга:
/**
 * BOOK рендеринг перед завершением book.before-complete
 **/
$(document).on('book.before-complete',function (e,info) {
    /**
     * info: 
     * {
     *    "PAGE_BEGIN_INDEX": 0,  // начало страницы
     *    "PAGE_END_INDEX": 2,    // конец страницы
     *    "TOTAL_PAGE": 3         // общее количество страниц
     * }
     **/
});
  • Печать и фоновый рисунок:

    • Класс nop-no-print используется для скрытия элементов при печати.
    • Класс nop-force-background применяется для принудительной печати фона. Этот класс работает, когда опция forcePrintBackground установлена в false.
  • Нечётные и чётные страницы:

После установки плагина для упрощённой нумерации страниц, элементы получают соответствующие классы: nop-page-item-odd (нечётная страница), nop-page-item-even (чётная страница) и nop-page-item-pagenum-1 (номер страницы).

  • Разделение текста и блоков на разные страницы:

Если текст или блок разделяется на другую страницу, соответствующая часть помечается классом nop-link-last. Это позволяет обрабатывать такие элементы особым образом.

  • Тип браузера:

В узлах Book указывается тип браузера. Классы: chrome, firefox, safari, ie, qq, wechat, wkhtmltopdf.

  • Стиль для предварительного просмотра и печати:

Для узлов Book используются классы nop-book-preview (предварительный просмотр) и nop-book-print (печать).

  • Информация о свойствах PDF:

Можно добавить метатеги в HTML-код, которые будут включены в свойства PDF. С версии 1.12.0 это работает и для серверной генерации. Пример:

<meta name="author" content="nop">
<meta name="description" content="bookjs-eazy so eazy!!">
<meta name="keywords" content="PDF, bookjs">

Генерация PDF и использование инструмента командной строки:

  • Через браузер:

Нажмите кнопку «Печать» и выберите «Сохранить как PDF».

  • Серверная печать:

Используйте опцию bookConfig.toolBar.serverPrint. Серверную печать можно настроить с помощью значения true (эквивалентно {serverUrl: '/'}) или {serverUrl: '//your_screenshot_api_server_host[:WEB_PORT]/'}.

  • Самостоятельное создание сервиса печати (с использованием образа Docker):

Быстрое развёртывание осуществляется с помощью команды ./docker-start.sh. Можно создать файл book.html в каталоге dist и получить доступ к нему через http://127.0.0.1:3000/book.html для предварительного просмотра или скачивания PDF. Созданные PDF-файлы находятся в каталоге dist/pdf/.

  • Создание сервиса печати на локальном компьютере:

Предварительно установите Node.js и Yarn. Затем выполните следующие шаги:

  1. Клонируйте проект wuxue107/screenshot-api-server.
  2. Перейдите в каталог screenshot-api-server и установите зависимости с помощью yarn.
  3. Запустите сервис с помощью yarn start. По умолчанию он использует порт 3000.
  4. Укажите конфигурацию bookConfig.toolBar.serverPrint.serverUrl со значением '//your-screenshot-api-server[:PORT]/' для использования сервиса.
  • Командная строка:

Установите зависимости с помощью команды yarn install. Затем используйте команду bin/html2pdf print для создания PDF из URL. Пример:

bin/html2pdf print --output eazy-2-1.pdf "https://bookjs.zhouwuxue.com/eazy-2.html"

Команда имеет следующие опции:

  • -o или --output [outputfile]: путь сохранения PDF-файла (по умолчанию: output.pdf).

  • -t или --timeout [type]: время ожидания (по умолчанию: 60000).

  • -a или --agent [agent]: используемый движок преобразования (chrome-headless или puppeteer, по умолчанию: puppeteer).

  • -d или --printDelay [delay]: задержка перед печатью (в миллисекундах, по умолчанию: 1000).

  • -c или --checkJs [jsExpression]: выражение для проверки завершения рендеринга (по умолчанию: window.status === 'PDFComplete').

  • -h или --help: вывод справки по команде. ## Команды для печати с использованием wkhtmltopdf (генерирует PDF-закладки h1-h6)

    bin/pdf-a4-landscape "https://bookjs.zhouwuxue.com/eazy-2.html" eazy-2-2.pdf

В каталоге bin есть несколько аналогичных скриптов.

Синтаксис: bin/pdf-[формат бумаги]-[ориентация] [предварительный просмотр ссылки] [выходной файл]

  • Примечание: если вы используете пользовательские размеры при помощи wkhtmltopdf, не беспокойтесь. После рендеринга в браузере в консоли будет выведена команда wkhtmltopdf для создания PDF.

Часто задаваемые вопросы (памятка о распространённых проблемах)

Проблемы с печатью на стороне сервера:

  • Проблема: печать на сервере не работает.
    • Решение: сервер печати (screenshot-api-server) должен иметь доступ к HTML-странице, которую вы хотите распечатать.

Проблема с содержимым, выходящим за пределы страницы:

  • Некоторые элементы, такие как display: float, position: absolute; overflow, могут не изменять размер контейнера страницы. Это может привести к тому, что содержимое выйдет за пределы страницы.
  • Элементы с margin не могут расширить .nop-page-content, что приводит к смещению .nop-page-content и может вызвать переполнение содержимого. Поэтому рекомендуется использовать padding для управления относительным положением.
  • Перед установкой bookConfig.start = true содержимое страницы под #content-box не было загружено другими программами (Vue, React, Ajax и т. д.). Это может привести к повторной разбивке bookjs после загрузки, и другие программы могут изменить соответствующие узлы DOM, что приведёт к изменению размера узла и переполнению содержимого.

Появление лишних пустых страниц:

  • Не следует вручную изменять border/width/height/margin/padding для элементов html, body, .nop-book, .nop-page, .nop-page-items, .nop-page-item.

Каждая страница имеет дополнительную пустую страницу:

  • Смотрите опцию bookConfig.pageFixedHeightOffset для настройки.

Распечатывается пустая страница:

  • Пользователи сообщают, что после включения polyfill.min.js появляются пустые страницы. Этот файл используется для совместимости wkhtmltopdf с некоторыми функциями JavaScript. Если его удаление не влияет на печать, можно удалить этот файл.

Шрифты не отображаются:

  • В PDF-файлах, созданных на сервере, все отображается в виде рамок или не отображается из-за отсутствия необходимых шрифтов в среде Linux. Или загрузка веб-шрифтов слишком велика, что вызывает тайм-аут загрузки.

Различия между PDF и предварительным просмотром:

  • Для серверной генерации PDF могут возникнуть проблемы со шрифтами. Можно указать шрифт для каждой страницы. На сервере необходимо установить соответствующий шрифт. См.: «Детали дизайна» -> «Шрифты».

IFrame не встраивает веб-страницы и не позволяет загружать или печатать:

  • Необходимо добавить атрибут sandbox="allow-downloads allow-top-navigation allow-scripts allow-modals" в IFrame.

События страницы не работают:

  • После рендеринга bookjs-eazy события могут быть разделены на разные страницы. Попробуйте обработать события после завершения рендеринга PDF.

Не удаётся найти wkhtmltopdf:

  • При выполнении bin/pdf-xx-xx команд wkhtmltopdf не найден. Необходимо загрузить wkhtmltopdf и поместить его в каталог PATH.

Использование data-op-type="table" приводит к неправильному отображению объединённых ячеек таблицы:

  • Рекомендуется сначала использовать data-op-type="block", чтобы сохранить таблицу на одной странице и проверить правильность макета без разделения. Затем можно заполнить данные и использовать data-op-type="table". Если возникают проблемы, можно воспроизвести сценарий здесь тестирование таблицы, сохранить и скопировать ссылку. Отправить issue.

Тайм-аут при загрузке PDF:

  • Серверная генерация PDF занимает слишком много времени. Возможно, ваша страница требует токена и сеанса для доступа, а бэкенд не может правильно получить доступ к вашей странице.

Страница зависает, загрузка процессора высокая:

  • Bookjs-eazy не может пройти через импорт и повторную компиляцию. Решение: необходимо включить через тег script в HTML.
  • Используется блок block, который превышает одну страницу, и его нельзя разместить на одной странице. Обычно это происходит в «[data-op-type=»table«] td>[data-op-type=»block«]», где нижний элемент td не имеет data-op-type, он также считается блоком по умолчанию. Рекомендуется разумно разделить блоки block, чтобы их можно было разместить на одной странице.

Компоненты не отображаются:

  • Когда bookConfig.padding = "0 0 0 0", компоненты на краю страницы не отображаются при предварительном просмотре печати в Firefox. Измените bookConfig.padding на "1px 0 0 0" или попробуйте добавить пустой текстовый узел <span>&nbsp<span> на страницу.

QQ группа для общения

alt

— Репозитории: GITEE | GITHUB.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wuxue107-bookjs-eazy.git
git@api.gitlife.ru:oschina-mirror/wuxue107-bookjs-eazy.git
oschina-mirror
wuxue107-bookjs-eazy
wuxue107-bookjs-eazy
master