想象在pdf信件上覆盖文本

时间:2011-07-04 14:48:18

标签: php imagick

我有pdf设计的信件。现在使用php我想获取地址并将其放在pdf字母上并动态生成另一个带有该地址的pdf文件。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

使用imagick / imagickdraw(分机:php-imagick)在Windows下进行设置是一件很痛苦的事情,但如果你正在运行linux,它会非常快速和简单。

$Imagick = new Imagick();
$Imagick->setResolution(300,300);
$Imagick->readImage('my.pdf[' . $page_number . ']');

$width = $Imagick->getImageWidth();
$height = $Imagick->getImageHeight();

$height *= (float) (2550 / $width);
$Imagick->scaleImage(2550, $height);

if (0 != $rotation)
    $Imagick->rotateImage(new ImagickPixel(), $rotation);

$scaled_ratio = (float)$Imagick->getImageWidth() / 850;

// put white boxes on image
$ImagickDraw = new ImagickDraw();
$ImagickDraw->setFillColor('#FFFFFF');
$ImagickDraw->rectangle($x1, $y1, $x2, $y2);

$Imagick->drawImage($ImagickDraw);

// put text in white box (really on canvas that has already been modified)
$ImagickDraw = new ImagickDraw();

/* Font properties for text */
$ImagickDraw->setFont('times');
$ImagickDraw->setFontSize(42); // 10 * 300/72 = 42
$ImagickDraw->setFillColor(new ImagickPixel('#000000'));
$ImagickDraw->setStrokeAntialias(true);
$ImagickDraw->setTextAntialias(true);

// add text to canvas (pdf page)
$Imagick->annotateImage(
    $ImagickDraw,
    $x1 + 4, // 1 * 300/72 = 4
    $y1 + 42, // 10 * 300/72 = 42
    0,
    $the_text // do not use html.. strip tags and replace <br> with \n if you got the text rom an editable div. (which is what I'm doing)
    );

$Imagick->writeImage($filename);

我实际上使用ghostscript将pdfs(写入临时目录的各个页面)合并为单个pdf。我看到的唯一问题是页面看起来很褪,我使用了$ Imagick-&gt; annotateImage()或$ Imagick-&gt; drawImage()。我现在正在弄清楚这就是我发现这个问题的原因。

我想这是一个半答案,但我希望它有所帮助。

---通过编辑添加4/6/2012 --- 找到了解决PDF图像褪色的方法。

$Imagick->setImageFormat("jpg");
$Imagick->writeImage('whatever.jpg');

$Imagick = new Imagick();
$Imagick->setResolution(300,300);
$Imagick->readImage('whatever.jpg');

---通过编辑5/1/2012的另一个补充--- 找到了一种从pdf到tif的灰度等级看起来很糟糕的方法。 只需一个命令。 Ghostscript PDF -> TIFF conversion is awful for me, people rave about it, I alone look sullen

$Imagick->blackThresholdImage('grey');

---编辑结束5/1/2012 ---

$Imagick->setImageFormat("pdf");
$Imagick->writeImage($filename);

答案 1 :(得分:0)

许可证价格昂贵,但PDFlib专为此类设计 - 打开模板.pdf文件并动态添加新项目以生成输出pdf。还有其他免费的PDF操作库,例如TCPDF,可能会做同样的事情。

答案 2 :(得分:0)

我将fpdffpdi一起使用。它对我很好。我几乎没有任何问题地覆盖了数千个文件。