使用Zend Framework合并2个pdf文件

8

我正在尝试合并两个PDF文件,一个文件位于我的服务器上(不是动态生成的),另一个是在合并之前生成的,没有保存在服务器上(我只希望客户端下载它)。因此,我只有PDF的内容。两个PDF具有相同的格式(A4)。

合并后的文件将有2页,并且也不会保存在服务器上。

由于我使用Zend Framework,我希望能用它来解决这个问题(但是在网上找不到解决方案……),否则有什么建议吗?

{{link1:(在网上找到的常见解决方案,但不起作用)}}

编辑:因为人们懒得点击链接。代码无论如何都在链接中,因为它是错误的并且不起作用。

我尝试了下面的脚本,但是出现以下错误:

未捕获异常'Zend_Pdf_Exception',消息为“该页面附加到一个文档中,但在另一个文档的上下文中呈现”


@Gordon:好的,请阅读链接页面>_>我尝试下面的脚本,但是出现错误:Uncaught exception 'Zend_Pdf_Exception' with message 'Page is attached to one document, but rendered in context of another。我知道我讨厌“不起作用”的问题,但是在这里,你只需要阅读…… - Shikiryu
2
谢谢澄清。在提问时尽可能完整地陈述问题,而不是指责那些寻求帮助的人懒惰。一开始就没有放上所有信息才是懒惰。此外,您是否尝试使用那里提供的代码来解决用户出现的错误?我搜索了一下这个错误消息,似乎在1.11中已经修复了此特定错误 - Gordon
@Gordon: 我一开始不应该提到这个错误(是的,我尝试了网上找到的所有方法;)),我只是在展示我所做的研究和测试。只是为了表明,我没有像一些人现在这样来这里获得预先消化的答案。我现在正在尝试1.11看它是否可行,保持你们的通知。我目前使用的是1.9。 - Shikiryu
5个回答

11

在我的问题中,借助@Gordon的评论指南,我得到了一个解决方案。

  1. 您必须至少拥有Zend Framework 1.11(我在1.9中,首先出错)(通过这个问题的第三个评论找到)
  2. 您必须从要合并的PDF克隆页面,否则,您的应用程序将打印错误(自说明)(感谢这个slideshare,它非常有趣对于Zend_Pdf)
  3. 静态PDF必须是PDF <= 1.4(我的是1.6)。 Zend_Pdf无法解析版本大于1.4的PDF

我使用此应用程序将我手头上的1.6版本静态文件转换为1.4版本。

以下是我已经运行的草稿代码(我知道它没有进行优化,稍后我会做;但仍然可能很有用)

$pdf2show = new Zend_Pdf();  // Initializing the merged PDF
$pdf1 = Zend_Pdf::parse($pdfContent, 1); // $pdfContent is the generated one, got the content...
$template = clone $pdf1->pages[0]; // cloning the page (a must do)
$page1 = new Zend_Pdf_Page($template); // Creating the first page of the merged PDF with the previous content
$pdf2show->pages[] = $page1; // Adding this page to the final PDF
$pdf2 = Zend_Pdf::load('urlToYourPDF.pdf'); // Loading the statif PDF
$template2 = clone $pdf2->pages[0]; // cloning the page (a must do)
$page2 = new Zend_Pdf_Page($template2); // Creating the second page of the merged PDF with the previous content
$pdf2show->pages[] = $page2; // Adding this page to the final PDF
sendToWebBrowser('title', $pdf2show->render());

sendToWebBrowser 是一个函数,用于将 PDF 内容发送到浏览器,并使用 title 作为标题。 $pdf2show->render() 将合并的 PDF 内容生成一个字符串。


看,一个解决方案 :) 只有因为你告诉了我错误信息才找到的。 - Gordon

4
$extractor = new Zend_Pdf_Resource_Extractor();
$clone_page_to_use_in_any_pdf = $extractor->clonePage($original_pdf->pages[0]);

这是我完成的方法。 希望这能帮到大家。 TJ

1
在我看来,这是最好的解决方案! - Kevin

2
$extractor = new Zend_Pdf_Resource_Extractor();

$page1 = $extractor->clonePage($pdf->pages[$templatePageIndex1]);
$page2 = $extractor->clonePage($pdf->pages[$templatePageIndex2]);
$page1->drawText('Some text...', $x, $y);
$page2->drawText('Another text...', $x, $y);

$pdf = new Zend_Pdf();
$pdf->pages[] = $page1;
$pdf->pages[] = $page2;

直接从消息源获得信息。 http://framework.zend.com/manual/zh/zend.pdf.pages.html#zend.pdf.pages.cloning

没错,但是你的例子并没有回答问题 ;) 它从同一个pdf $pdf中提取页面。 - Shikiryu

0

我在合并PDF文件方面的经验:

  • Zend_Pdf对于大型编译不够快速和高效,
  • pdftk会失去文档书签,在合并文档的大小超过特定大小时会崩溃,
  • pdflib非常快速,能够保留书签,并且适用于大型编译。

-1

你尝试过使用PDF工具包合并它们吗?

使用它合并多个PDF文件可以实现以下操作:

pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf

生成的PDF将为123.pdf。您可以将生成的PDF暂时存储在服务器上,发送到浏览器并在不再需要时将其删除。


谢谢你的回答。不幸的是,我不能使用这个解决方案。1- 我不能在服务器上安装任何东西(这是另一个人的工作,他非常忙,两周内无法完成)2- 最好不要保存在服务器上。 - Shikiryu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接