Кто-нибудь знает о хорошем методе редактирования PDF-файлов в PHP? Предпочтительно использовать методы затрат с открытым исходным кодом / нулевой лицензией. 🙂
Я думаю о том, как открыть PDF-файл, заменив текст в PDF-файле, а затем выписав измененную версию PDF-файла?
Я использовал программные файлы PDF в прошлом, используя FPDF, но обнаружил, что это иногда немного громоздко.
Если вы используете подход «заполнить пустой», вы можете точно разместить текст в любом месте на странице. Поэтому относительно легко (если не немного утомительно) добавить недостающий текст в документ. Например, с 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');
Если вы пытаетесь заменить встроенный контент, например «[placeholder string]», это становится намного сложнее. Хотя это технически возможно, вы, вероятно, испортите макет страницы.
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.
<?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); ?>
Я действительно возлагал большие надежды на dompdf (это крутая идея), но проблема позиционирования является основным фактором в использовании fpdf. Хотя это утомительно, поскольку каждый элемент должен быть установлен; это мощно, поскольку все выходят.
Я помещаю изображение под своим рабочим пространством в документе, чтобы поместить мой макет сверху. Его всегда было достаточно даже для столбцов (требуется крошечный бит вычисления строки php, но ничего страшного).
Удачи.
Tcpdf также хорош для создания pdf в php http://www.tcpdf.org/
Мы используем pdflib для создания PDF-файлов из наших приложений rails. Он имеет привязки для PHP и множество других языков.
Мы используем коммерческую версию, но у них также есть бесплатная версия с открытым исходным кодом, которая имеет некоторые ограничения.
К сожалению, это позволяет создавать PDF-файлы.
Если вы хотите открыть и «редактировать» существующие файлы, pdflib действительно предоставляет продукт, который делает это , но стоит LOT