imagick 在 pdf 字母上覆盖文本

发布于 2024-11-18 07:18:10 字数 86 浏览 1 评论 0原文

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

我该怎么办呢。

I have pdf designed letter. Now using php I would like to fetch the address and put it on pdf letter and generate another pdf file with that address dynamically.

How can I do this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

听闻余生 2024-11-25 07:18:10

使用 imagick / imagickdraw (ext: 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 将 pdf(写入临时目录的各个页面)合并为单个 pdf。我看到的唯一问题是我使用 $Imagick->annotateImage() 或 $Imagick->drawImage() 的页面似乎褪色。我现在正在弄清楚这就是我发现这个问题的原因。

我想这是一个一半的答案,但我希望它对某人有帮助。

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

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

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

--- 通过编辑 2012 年 5 月 1 日的另一个补充 ---
找到了一种从 pdf 到 tif 的灰度方法,看起来很糟糕。
只需一个命令。
Ghostscript PDF -> ; TIFF 转换对我来说很糟糕,人们对它赞不绝口,我一个人看起来闷闷不乐

$Imagick->blackThresholdImage('grey');

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

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

using imagick / imagickdraw (ext: php-imagick) It's a pain to setup under windows but if you're running linux it's pretty quick and easy.

$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);

I actually use ghostscript to merge the pdfs (individual pages written to a temp directory) into a single pdf. The only problem I've seen is pages seem faded where I've used $Imagick->annotateImage() or $Imagick->drawImage(). I'm figuring that out right now which is why I found this question.

I guess It's a half answer but I hope it helps someone.

--- addition via edit 4/6/2012 ---
Found a way around the PDF image fading.

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

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

--- another addition via edit 5/1/2012 ---
Found a way around greyscale from pdf to tif looking awful.
Just one command.
Ghostscript PDF -> TIFF conversion is awful for me, people rave about it, I alone look sullen

$Imagick->blackThresholdImage('grey');

--- end of edit 5/1/2012 ---

$Imagick->setImageFormat("pdf");
$Imagick->writeImage($filename);
别念他 2024-11-25 07:18:10

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

It's expensive for a license, but PDFlib is designed for such things - opening a template .pdf file and adding new items dynamically to produce an output pdf. There's other free PDF manipulation libraries such as TCPDF which can probably do the same thing.

始于初秋 2024-11-25 07:18:10

我将 fpdffpdi。它对我来说效果很好。我几乎没有任何问题地覆盖了数千个文件。

I used fpdf with fpdi. It worked fine with me. I almost overlayed thousands of file without any problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文