Mpdf - проблема с перезаписью зашифрованных файлов - PullRequest
0 голосов
/ 08 января 2019

У меня ОГРОМНАЯ проблема с перезаписью зашифрованных файлов с помощью mpdf. И мне нужно перезаписывать их вместо того, чтобы генерировать их каждый раз, потому что для генерации файлов требуется много времени, а перезапись их - это мощная стратегия, которая может занять несколько секунд вместо десяти минут. Мои примеры, показанные ниже, основаны на решении примера 2 этой гиперссылки . На самом деле, я могу перезаписать их, когда они генерируются без шифрования. Но всякий раз, когда я пытаюсь зашифровать, я получаю пустую страницу, которая кажется бесполезной. И шифрование необходимо, чтобы избежать пиратства.

Код, использованный для создания PDF, приведен ниже:

<?php
require_once '..\www\vendor\autoload.php';
$mpdf = new mPDF();
$mpdf->percentSubset = 0;
$mpdf->SetProtection(array(), '', 'bread');   // Need to specify a password

$mpdf->WriteHTML('This copy is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
$mpdf->Output('test.pdf','F');

// Have to save various encryption keys, which are uniquely generated each document
$uid = $mpdf->uniqid;
$oval = $mpdf->Ovalue;
$encKey = $mpdf->encryption_key;
$uval = $mpdf->Uvalue;
$pval = $mpdf->Pvalue;
$RC128 = $mpdf->useRC128encryption;

unset($mpdf);    
?>

Код, используемый для перезаписи исходного файла, выглядит следующим образом:

<?php
error_reporting(0); // had to include this to open with google chrome
ini_set('display_errors', 0); // had to include this to open with google chrome
ob_clean(); // had to include this to open with google chrome

require_once '..\www\vendor\autoload.php';
$mpdf = new mPDF();
$mpdf->SetImportUse();

// Re-instate saved encryption keys from original document
$mpdf->encrypted = true;
$mpdf->useRC128encryption = $RC128;
$mpdf->uniqid = $uid ;
$mpdf->Ovalue = $oval ;
$mpdf->encryption_key = $encKey ;
$mpdf->Uvalue = $uval ;
$mpdf->Pvalue = $pval ;

$search = array(
    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
);

$replacement = array(
    "personalised for Jos\xc3\xa9 Bloggs"
);

$mpdf->OverWrite('test.pdf', $search, $replacement, 'I', 'mpdf.pdf' ) ;
?> 

Буду очень признателен и благодарен за решение этой проблемы! Mpdf великолепен, имеет много инструментов, но генерация файлов занимает много времени. Перезапись их - единственное решение, которое может помочь конечному пользователю загружать файлы со своими личными данными. Было бы еще лучше иметь решение, которое можно перезаписать с помощью шифрования, поскольку в руководстве сказано, что это возможно, но я не смог решить сам ...

1 Ответ

0 голосов
/ 12 января 2019

Хорошо, я понял, подумав о комментариях и много часов пытаясь и пытаясь повторить попытку. Можно сгенерировать pdf и перезаписать разные php-страницы, используя mpdf с поддержкой шифрования. Когда мы устанавливаем шифрование, генерируются переменные $ uid, $ oval, $ encKey, $ RC128, $ uval и $ pval. Всякий раз, когда мы генерируем PDF снова, эти переменные меняются, поэтому важно сгенерировать один раз. После генерации мы должны отправить значения этих переменных на сервер. На странице для перезаписи pdf данными клиента, поддерживающими шифрование, мы должны восстановить эти переменные с сервера, чтобы mpdf мог принять решение перезаписать зашифрованный pdf, поддерживающий шифрование в перезаписанном архиве.

Ниже приведен код для генерации зашифрованного pdf и отправки переменных на сервер:

<?php 
define('MPDF_PATH','class/mpdf/');
include("../mpdf60/mpdf.php");

$mpdf = new mPDF();
error_reporting(0);
ini_set('display_errors', 0);
ob_clean();

$mpdf->SetImportUse();
$pagecount = $mpdf->SetSourceFile("testb.pdf");
$mpdf->SetDocTemplate('testb.pdf',true);
  for ($i=1; $i<=$pagecount; $i++) {
       $import_page = $mpdf->ImportPage($i);
        $mpdf->UseTemplate($import_page);

        if ($i < $pagecount)
            {$mpdf->AddPage();
    }}

$mpdf->percentSubset = 0;
$mpdf->SetProtection(array(), '', 'yourpassword');   // Need to specify a password

$mpdf->WriteHTML('This copy is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');

$mpdf->Output('test.pdf','F');

// Have to save various encryption keys, which are uniquely generated each document
$uid = $mpdf->uniqid;
$oval = $mpdf->Ovalue;
$encKey = $mpdf->encryption_key;
$uval = $mpdf->Uvalue;
$pval = $mpdf->Pvalue;
$RC128 = $mpdf->useRC128encryption;

unset($mpdf);

//==============================================================

$mpdf = new mPDF();
$mpdf->SetImportUse();

// Re-instate saved encryption keys from original document
$mpdf->encrypted = true;
$mpdf->useRC128encryption = $RC128;
$mpdf->uniqid = $uid ;
$mpdf->Ovalue = $oval ;
$mpdf->encryption_key = $encKey ;
$mpdf->Uvalue = $uval ;
$mpdf->Pvalue = $pval ;

//Here is the code to update the variables on your server. It is important to already have created a table and have filled the first line with some text in order to update properly 

$sql2= "UPDATE `yourtable` SET `uid`='$uid', `oval`='$oval', `encKey`='$encKey', `uval`='$uval', `pval`='$pval', `RC128`='$RC128' WHERE `pdfline`='firstpdf'";
$result2 = mysqli_query($users, $sql2);
?>

После этого код для перезаписи зашифрованного файла следующий:

<?php
define('MPDF_PATH','class/mpdf/');
include("../mpdf60/mpdf.php");

$nomestep1 = mysqli_query ($users, "SELECT `uid` FROM yourtable WHERE `pdfline`='firstpdf'");
$nomestep2 = mysqli_num_rows ($nomestep1);
        for ($i=0 ; $i<$nomestep2 ; $i++)
        {
            $nomestep3 = mysqli_fetch_row($nomestep1);
            echo $nomestep3[0];
            }
$uid = $nomestep3[0];

// In order to illustrate, I showed the recovery from the server of just one variable. The others can be obtained using the same process

$mpdf = new mPDF();
$mpdf->SetImportUse();

// Re-instate saved encryption keys from original document
$mpdf->encrypted = true;
$mpdf->useRC128encryption = $RC128;
$mpdf->uniqid = $uid ;
$mpdf->Ovalue = $oval ;
$mpdf->encryption_key = $encKey ;
$mpdf->Uvalue = $uval ;
$mpdf->Pvalue = $pval ;

$search = array(
    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
);

$replacement = array(
    "personalised for Jos\xc3\xa9 Bloggs"
);

error_reporting(0);
ini_set('display_errors', 0);
ob_clean();
$mpdf->OverWrite('test.pdf', $search, $replacement, 'I', 'mpdf.pdf' ) ;
?>

Вот и все. Я надеюсь, что этот код может помочь другим так же, как он помог мне!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...