Недавно возникла задача распространять PDF-файлы с “водяным знаком” - персонализированные версии журнала с отметкой, для кого они были подготовлены. Генерировать оные нужно из веб-приложения (при том что сами журналы сделаны в InDesign). Существует, как выяснилось, масса библиотек дабы PDF создать с нуля, но почти нету оных чтобы уже существующий PDF обработать (в особенности - не имея оригинальных шрифтов например).

Оказалось, что ни на Ruby ни на PHP внятного решения нет, зато есть совершенно магическое на Perl. Дабы никому не пришлось тратить на поиски солюшена много времени (среди кучи бессмысленного shareware для этой задачи под Винды отыскать то что нужно непросто), сразу код.

use PDF::Reuse;
use PDF::Reuse::Util;
use strict;

my ($name) = @ARGV;
  
prFile('book_for_someone.pdf');

my $sourcePdf = 'pdf_that_your_designer_made.pdf';
my $greeting = "This book is personalized for " . $name;

my $left = 1;
while ($left) {
   prFont('HO');
   prAdd("0 0 0 rg\n0 g\nf\n");

   prText( 38, 800, $greeting);
   $left = prSinglePage($sourcePdf);   
} 
 
prEnd;

И дальше из любого веб-приложения через командную строку поднимается как

perl make_pdf.pl "John Doe"

Работает по сути гениально - читает старый PDF и засовывает его как графику в генерируемый новый (по принципу матрешки). Если хотите быть оригинальным рекомендую впечатывать не один ватермарк, а два - один из них двухпунктовым белым шрифтом :-)