Добавить динамический водяной знак в PDF - PullRequest
0 голосов
/ 06 июня 2018

Итак, я разработал инструмент PHP, который позволяет нашей бухгалтерии манипулировать PDF-файлами.Как только они закончат модификацию PDF, они захотят добавить водяной знак, который будет его номером счета.Я использовал библиотеку PHP под названием FPDF, но это не помогло, если PDF по какой-то причине версии 3.

Я не смог найти способ сделать это ни с помощью PHP, ни с помощью команды Linux (Использование PHP-функции shell_exec).Другая проблема заключается в том, что иногда PDF-файл зашифрован и требует изменения пароля, который мы не знаем.

Основной поток будет

  1. PDF загружен в каталог, готовыйдля обработки учетных записей
  2. учетные записи обрабатывают PDF
  3. Номер счета-фактуры создается автоматически
  4. Номер счета-фактуры помечается водяными знаками в PDF, а файл PDF перемещается в обработанный каталог

Все это работает, пока мы не дойдем до водяного знака.

Кто-нибудь знает решение этой проблемы?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Некоторая информация о вещах, которые вы использовали ранее: FPDF не может обрабатывать существующие PDF-файлы, поэтому, я думаю, вы использовали FPDI в сочетании с FPDF для повторного создания исходного документа.

Бесплатная версия FPDI не поддерживает функцию сжатия, представленную в PDF 1.5.В любом случае мы предлагаем коммерческое дополнение, которое добавляет поддержку для этого: FPDI PDF-Parser .

Во всяком случае, ни FPDI, ни FPDI PDF-Parser не поддерживают чтение зашифрованных / защищенных PDF-документов..

НО: Специально для нанесения водяных знаков мы предлагаем другой продукт (не бесплатный!), Который сделан именно для этой цели: SetaPDF-Stamper компонент.

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

Aпростой водяной знак можно сделать так:

require_once('library/SetaPDF/Autoload.php');
// or if you use composer require_once('vendor/autoload.php');

// create a file writer
$writer = new SetaPDF_Core_Writer_File('processed/directory/result.pdf');
// load document by filename
$document = SetaPDF_Core_Document::loadByFilename('your.pdf', $writer);

// create a stamper instance for the document
$stamper = new SetaPDF_Stamper($document);

// create a font for this document
$font = new SetaPDF_Core_Font_TrueType_Subset($document, 'fonts/DejaVuSans.ttf');

// create a stamp with the created font and font size 60
$stamp = new SetaPDF_Stamper_Stamp_Text($font, 60);
// center the text to the text block
$stamp->setAlign(SetaPDF_Core_Text::ALIGN_CENTER);
// set text for the stamp
$stamp->setText($theInvoiceNo);

// add the stamp to the center of the page and rotate it by 60 degrees
$stamper->addStamp(
    $stamp,
    [
        'position' => SetaPDF_Stamper::POSITION_CENTER_MIDDLE,
        'rotation' => 60
    ]       
);

// stamp the document
$stamper->stamp();

// save the file and finish the writer (e.g. file handler will closed)
$document->save()->finish();
0 голосов
/ 06 июня 2018

Вы можете комбинировать (pdf) изображения с Imagick, вы можете наложить свой водяной знак и установить непрозрачность:

    $combined = new \Imagick("background.jpg");

    $image = new \Imagick("watermark.jpg");
    $image->setImageOpacity(0.7);
    $combined->compositeImage($image, \Imagick::COMPOSITE_DEFAULT, 354, 237);

    $combined->setImageFormat("pdf");
    $combined->setResolution(300,300);
    $combined->setImageProperty('title', 'your file');
    $combined->setFilename("your file.pdf");

    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="your file.pdf"');
    echo $combined;
    exit;

Или установить аннотацию:

function annotateImage($imagePath, $strokeColor, $fillColor)
{
    $imagick = new \Imagick(realpath($imagePath));

    $draw = new \ImagickDraw();
    $draw->setStrokeColor($strokeColor);
    $draw->setFillColor($fillColor);

    $draw->setStrokeWidth(1);
    $draw->setFontSize(36);

    $text = "Imagick is a native php \nextension to create and \nmodify images using the\nImageMagick API.";

    $draw->setFont("../fonts/Arial.ttf");
    $imagick->annotateimage($draw, 40, 40, 0, $text);

    header("Content-Type: image/jpg");
    echo $imagick->getImageBlob();
}
...