Редактирование PDF в PHP?
Кто-нибудь знает о хорошем методе редактирования PDF файлов в PHP? Предпочтительно использовать методы затрат с открытым исходным кодом/нулевой лицензией.:)
Я думаю о том, как открыть PDF файл, заменив текст в PDF файле, а затем выписав измененную версию PDF?
Я использовал программные файлы PDF в прошлом, используя FPDF, но иногда обнаруживал, что это немного громоздко.
Ответы
Ответ 1
Если вы используете подход "заполнить пустой", вы можете точно разместить текст в любом месте на странице. Поэтому относительно легко (если не немного утомительно) добавить недостающий текст в документ. Например, с 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');
Если вы пытаетесь заменить встроенный контент, например "[stringholder string]", он становится намного сложнее. Хотя это технически возможно, вы, вероятно, испортите макет страницы.
PDF-документ состоит из набора операций примитивного рисования: строка здесь, изображение здесь, текстовый фрагмент и т.д. Он не содержит никакой информации о намерении компоновки этих примитивов.
Ответ 2
Для создания 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');
Ответ 3
Если вам нужны действительно простые PDF файлы, то Zend или FPDF в порядке. Однако мне трудно и сложно работать. Кроме того, из-за того, как работает API, нет хорошего способа отделить контент от представления из бизнес-логики.
По этой причине я использую dompdf, который автоматически преобразует HTML и CSS в документы PDF. Вы можете выложить шаблон так же, как и для HTML-страницы, и использовать стандартный синтаксис HTML. Вы даже можете включить внешний файл CSS. Библиотека не идеальна, и очень сложная разметка или css иногда становятся искалеченными, но я не нашел ничего другого, что работает.
Ответ 4
Zend Framework может загружать и редактировать существующие файлы PDF. Я думаю, что он поддерживает ревизии тоже.
Я использую его для создания документов в проекте, и он отлично работает. Никогда не редактировал, хотя.
Проверьте документ здесь
Ответ 5
Не знаю, является ли это вариантом, но он будет очень похож на библиотеку Zend pdf, но вам не нужно загружать кучу дополнительного кода (рамки zend). Он просто расширяет FPDF.
http://www.setasign.de/products/pdf-php-solutions/fpdi/
Здесь вы можете в принципе сделать то же самое. Загрузите PDF файл, напишите поверх него, а затем сохраните его в новом PDF файле. В FPDI вы в основном вставляете PDF в качестве изображения, чтобы вы могли поместить все, что хотите.
Но опять же, это использует FPDF, поэтому, если вы не хотите его использовать, это не сработает.
Ответ 6
Документация по расширению PDF/pdflib в PHP разрежена (что было отмечено в bugs.php.net). Я рекомендую вам использовать библиотеку Zend.
Ответ 7
Tcpdf также является хорошим для создания pdf в php
http://www.tcpdf.org/
Ответ 8
У меня действительно были большие надежды на dompdf (это крутая идея), но проблема позиционирования является основным фактором в использовании fpdf. Хотя это утомительно, поскольку каждый элемент должен быть установлен; это мощно, поскольку все выходят.
Я помещаю изображение под своим рабочим пространством в документе, чтобы поместить мой макет сверху. Его всегда было достаточно даже для столбцов (требуется крошечный бит вычисления строки php, но ничего слишком страшного).
Удачи.
Ответ 9
Мы используем pdflib для создания PDF файлов из наших приложений rails. Он имеет привязки для PHP и множество других языков.
Мы используем коммерческую версию, но у них также есть версия свободного/открытого исходного кода, которая имеет некоторые ограничения.
К сожалению, это позволяет создавать PDF файлы.
Если вы хотите открыть и "отредактировать" существующие файлы, pdflib предоставит продукт, который делает это,, но стоит a LOT
Ответ 10
<?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);
?>