【问题标题】:Mpdf - Problem overwriting encrypted filesMpdf - 覆盖加密文件的问题
【发布时间】:2019-01-08 00:18:08
【问题描述】:

我在用 mpdf 覆盖加密文件时遇到了很大的问题。而且我需要覆盖它们而不是每次都生成它们,因为生成文件需要很长时间,而覆盖它们是一种强大的策略,可能需要几秒钟而不是十分钟。我下面展示的例子是基于这个hyperlink的例子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很棒,有很多工具,但是生成文件需要很长时间。覆盖它们是唯一可以使最终用户在下载带有个人数据的文件时获得良好体验的解决方案。最好有一个可以用加密覆盖的解决方案,因为手册说这是可能的,但我自己无法解决......

【问题讨论】:

  • 我猜那些脚本不在同一个文件中,因为你都需要自动加载器?如果它们是分开的,那么您尝试使用的变量($RC128$uid$oval$encKey$uval$pval)将不会在第二个脚本中定义,除非您将它们设置在您没有向我们展示过的地方。
  • 嗨,马格努斯!感谢您的回答!我知道由于输出,它们应该位于单独的文件中。输出结束该行之后的任何内容。这就是为什么我认为示例中的变量出现在输出之后很奇怪。我试图把它们放在前面,但没有成功。其实我在例子中并没有定义那些奇怪的变量,我只是像例子一样使用它们,没有出现错误。你认为我应该尝试命名变量 $RC128 = 'anything';在两个档案中看看会发生什么?
  • “这就是为什么我认为示例中的变量很奇怪” - 所以这段代码实际上并不是你创建的,而是一个示例的副本?无论如何,您不能期望未定义的变量按预期工作。如果您打开了display_errors 或检查了您的服务器错误日志,您至少会看到一些警告。我会从那里开始尝试先把它们整理出来。
  • 嗨,马格努斯!我根据您的评论取得了进展,即它们位于单独的文件中,但这并不是让他们使用单个存档来生成和覆盖的理想解决方案。那是因为生成我正在处理的文件大约需要 10 分钟。因此,作为管理员,我的想法是一次性生成存档,该存档将用作模型,以便可以覆盖其余部分以替换某些文本。我可以用单独的文件做到这一点,但没有加密。
  • 到目前为止,我无法快速将 SetProtection 应用于任何文件,因为 mpdf 没有一种方法 - 我知道 - 添加整个存档,只需逐页增加总数时间到几分钟。有没有办法可以在评论中或仅在我们创建问题时发布代码以在单个 php 文件中生成和覆盖?

标签: php pdf output overwrite mpdf


【解决方案1】:

好的,在考虑了 cmets 和数小时的尝试和重试之后,我明白了。可以使用 mpdf 维护加密来生成 pdf 并用不同的 php 页面覆盖。当我们设置加密时,会生成变量 $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' ) ;
?>

就是这样。我希望这段代码可以像它帮助我一样帮助其他人!

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 2013-05-11
    • 2020-05-18
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多