Как инвертировать PDF-файл с помощью OCG/Layers?

Как инвертировать PDF-файл с помощью OCG/Layers?

Я создаю PDF, предназначенный для просмотра на экранах/планшетах, и использую белый текст на черном фоне. Поскольку некоторые читатели могут захотеть распечатать его, а я хочу избежать создания второго PDF, я хотел бы включить Print View как Layer в PDF.

Как заставить (xe)latex отображать один и тот же текст дважды друг над другом, с фоновым изображением между ними, чтобы я мог использовать верхний текстовый слой и изображение как один PDF-слой, чтобы отключить его?

Таким образом, в PDF-файле будет следующий порядок слоев (читать снизу вверх):

WHITE TEXT       \
                  > OCG Layer #1
BLACK BACKGROUND /

BLACK TEXT       \
                  > regular PDF
WHITE BACKGROUND /

Теперь, если программа чтения PDF-файлов скроет слой № 1, то расположенная под ним версия для печати станет видимой.

решение1

В этом примере создаются две разные версии готового блока страницы, которые размещаются на отдельных слоях OCG.

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

Более того, мы запрещаем печатать версию «белым по черному», чтобы пользователь случайно не потратил драгоценные чернила. (Хотя это гарантируют только AcroRead и встроенный в Chrome/Chromium просмотрщик PDF-файлов.)

Для этого примера требуется достаточно новая и актуальная установка TeX, например TeXLive-2020:

\documentclass{article}

\usepackage[a5paper]{geometry}
\usepackage{kantlipsum}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{ocgx2} %pdf layers
\usepackage{color}

\makeatletter
%make a copy from each ready page and repeat it with white
%textcolour on black background, put both versions on different layers
\AddToHook{shipout/before}{%
  \setbox\ShipoutBox=\hbox{%
    %normal & print layer
    \begin{ocg}[
      radiobtngrp=reverse video,
      printocg=always,
    ]{normal and print}{normal}{off}%
      \makebox[0pt][l]{%
        \raisebox{1in}{\copy\ShipoutBox}%
      }%  
    \end{ocg}%  
    %layer for tablets & screens
    \begin{ocg}[
      radiobtngrp=reverse video,
      printocg=never,
    ]{for screens/tablets}{tablets}{on}%
      \makebox[0pt][l]{%
        \hspace{-1in}%
        \raisebox{0pt}[\dimexpr\height-1in\relax]{%
          \rule{\paperwidth}{\paperheight}}}%
      \raisebox{1in}{{\color{white}\box\ShipoutBox}}%
    \end{ocg}%
  }%  
}

\def\redefFooterAndHeader{%
  %proof of concept: --> repeat the following with
  %\@evenfoot, \@oddhead, \@evenhead
  \let\@oddfootOrig\@oddfoot%
  \gdef\@oddfoot{%
    \makebox[\textwidth][c]{%
      \begin{ocg}[
        radiobtngrp=reverse video,
        printocg=always,
      ]{normal and print}{normal}{off}%
        \makebox[0pt][c]{\@oddfootOrig}%
      \end{ocg}%  
      \begin{ocg}[
        radiobtngrp=reverse video,
        printocg=never,
      ]{for screens/tablets}{tablets}{on}%
        \makebox[0pt][c]{{\color{white}\@oddfootOrig}}%
      \end{ocg}%
    }%
  }%
}

\let\pagestyleOrig\pagestyle
\def\pagestyle#1{\pagestyleOrig{#1}\redefFooterAndHeader}%
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}\pagestyle{plain}
\kant[1-6]
\end{document}

введите описание изображения здесь

Связанный контент