Редактирование PDF в PHP? [закрыто]
Кто-нибудь знает хороший метод редактирования PDF-файлов в PHP? Предпочтительно методы с открытым исходным кодом/с нулевой стоимостью лицензии. :)
Я думаю о том, чтобы открыть файл PDF, заменить текст в PDF, а затем записать измененную версию PDF?
В прошлом я программно создавал PDF-файлы с помощью FPDF, но иногда находил их немного громоздкими.
10 answers
Если вы используете подход "заполнить пробел", вы можете точно разместить текст в любом месте страницы, где захотите. Таким образом, добавить отсутствующий текст в документ относительно легко (если не немного утомительно). Например, с помощью Zend Framework:
<?php
require_once 'Zend/Pdf.php';
$pdf = Zend_Pdf::load('blank.pdf');
$page = $pdf->pages[0];
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
$page->setFont($font, 12);
$page->drawText('Hello world!', 72, 720);
$pdf->save('zend.pdf');
Если вы пытаетесь заменить встроенное содержимое, такое как "[строка-заполнитель]", это становится намного сложнее. Хотя технически это возможно, вы, скорее всего, испортите макет страницы.
Документ PDF - это состоит из набора примитивных операций рисования: линия здесь, изображение здесь, фрагмент текста там и т.д. Он не содержит никакой информации о намерениях компоновки этих примитивов.
Существует бесплатный и простой в использовании класс PDF для создания PDF-документов. Он называется FPDF. В сочетании с FPDI (http://www.setasign.de/products/pdf-php-solutions/fpdi ) можно даже редактировать PDF-документы. Следующий код показывает, как использовать FPDF и FPDI для заполнения существующего подарочного купона данными пользователя.
require_once('fpdf.php');
require_once('fpdi.php');
$pdf = new FPDI();
$pdf->AddPage();
$pdf->setSourceFile('gift_coupon.pdf');
// import page 1
$tplIdx = $this->pdf->importPage(1);
//use the imported page and place it at point 0,0; calculate width and height
//automaticallay and ajust the page size to the size of the imported page
$this->pdf->useTemplate($tplIdx, 0, 0, 0, 0, true);
// now write some text above the imported page
$this->pdf->SetFont('Arial', '', '13');
$this->pdf->SetTextColor(0,0,0);
//set position in pdf document
$this->pdf->SetXY(20, 20);
//first parameter defines the line height
$this->pdf->Write(0, 'gift code');
//force the browser to download the output
$this->pdf->Output('gift_coupon_generated.pdf', 'D');
Если вам нужны действительно простые PDF-файлы, то Zend или FPDF подойдет. Однако я нахожу, что с ними трудно и неприятно работать. Кроме того, из-за того, как работает API, нет хорошего способа отделить контент от презентации от бизнес-логики.
По этой причине я использую dompdf, который автоматически преобразует HTML и CSS в документы PDF. Вы можете создать шаблон так же, как и для HTML-страницы, и использовать стандартный синтаксис HTML. Вы даже можете включить внешний Файл CSS. Библиотека не идеальна, и очень сложная разметка или css иногда искажаются, но я не нашел ничего другого, что работало бы так же хорошо.
Zend Framework может загружать и редактировать существующие PDF-файлы. Я думаю, что он также поддерживает изменения.
Я использую его для создания документов в проекте, и он отлично работает. Хотя никогда не редактировал ни одного.
Ознакомьтесь с документом здесь
Не знаю, возможен ли этот вариант, но он будет работать очень похоже на библиотеку pdf Zend, но вам не нужно загружать кучу дополнительного кода (фреймворк zend). Это просто расширяет FPDF.
Http://www.setasign.de/products/pdf-php-solutions/fpdi/
Здесь вы можете в принципе сделать то же самое. Загрузите PDF-файл, напишите поверх него, а затем сохраните в новом PDF-файле. В FPDI вы в основном вставляете PDF-файл в виде изображения, чтобы вы могли поместить на него все, что захотите.
Но опять же, здесь используется FPDF, поэтому, если вы не хотите его использовать, он не будет работать.
Документация по расширению PDF/pdflib в PHP скудна (что было отмечено в bugs.php.net ) - Я рекомендую вам использовать библиотеку Zend.
Tcpdf также является хорошей библиотекой для создания pdf в php http://www.tcpdf.org/
Я действительно возлагал большие надежды на dompdf (это классная идея), но проблема позиционирования является основным фактором в моем использовании fpdf. Хотя это утомительно, так как каждый элемент должен быть установлен; это мощно, так как все выходит наружу.
Я помещаю изображение под своим рабочим пространством в документе, чтобы разместить свой макет поверх, чтобы он соответствовал. Его всегда было достаточно даже для столбцов (требуется немного вычисления строк php, но ничего слишком головокружительного).
Удачи.
Мы используем pdflib для создания PDF-файлов из наших приложений rails. В нем есть привязки для PHP и множества других языков.
Мы используем коммерческую версию, но у них также есть бесплатная версия с открытым исходным кодом, которая имеет некоторые ограничения.
К сожалению, это позволяет создавать только PDF-файлы.
Если вы хотите открыть и "отредактировать" существующие файлы, pdflib предоставляет продукт, который делает это , но стоит МНОГО
<?php
//getting new instance
$pdfFile = new_pdf();
PDF_open_file($pdfFile, " ");
//document info
pdf_set_info($pdfFile, "Auther", "Ahmed Elbshry");
pdf_set_info($pdfFile, "Creator", "Ahmed Elbshry");
pdf_set_info($pdfFile, "Title", "PDFlib");
pdf_set_info($pdfFile, "Subject", "Using PDFlib");
//starting our page and define the width and highet of the document
pdf_begin_page($pdfFile, 595, 842);
//check if Arial font is found, or exit
if($font = PDF_findfont($pdfFile, "Arial", "winansi", 1)) {
PDF_setfont($pdfFile, $font, 12);
} else {
echo ("Font Not Found!");
PDF_end_page($pdfFile);
PDF_close($pdfFile);
PDF_delete($pdfFile);
exit();
}
//start writing from the point 50,780
PDF_show_xy($pdfFile, "This Text In Arial Font", 50, 780);
PDF_end_page($pdfFile);
PDF_close($pdfFile);
//store the pdf document in $pdf
$pdf = PDF_get_buffer($pdfFile);
//get the len to tell the browser about it
$pdflen = strlen($pdfFile);
//telling the browser about the pdf document
header("Content-type: application/pdf");
header("Content-length: $pdflen");
header("Content-Disposition: inline; filename=phpMade.pdf");
//output the document
print($pdf);
//delete the object
PDF_delete($pdfFile);
?>