Редактирование PDF в PHP?

Кто-нибудь знает хороший метод редактирования PDF-файлов на PHP? Предпочтительно методы с открытым исходным кодом / без затрат на лицензию. :)

Я думаю о том, как открыть файл PDF, заменить текст в PDF и затем записать измененную версию PDF?

В прошлом я программно создавал файлы PDF с помощью FPDF, но временами находил это немного громоздким.

Ответов (10)

Решение

Если вы используете подход «заполнить пробел», вы можете точно разместить текст в любом месте страницы. Так что добавить недостающий текст в документ относительно легко (если не немного утомительно). Например, с 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 состоит из набора примитивных операций рисования: линия здесь, изображение здесь, фрагмент текста там и т. Д. Он не содержит никакой информации о макете этих примитивов.

Zend Framework может загружать и редактировать существующие файлы PDF. Думаю, он тоже поддерживает исправления.

Я использую его для создания документов в проекте, и он отлично работает. Но ни разу не редактировал.

Посмотрите документ здесь

Tcpdf также является хорошей библиотекой для создания pdf на php http://www.tcpdf.org/

Мы используем pdflib для создания файлов PDF из наших приложений rails. Он имеет привязки к PHP и множеству других языков.

Мы используем коммерческую версию, но у них также есть бесплатная версия с открытым исходным кодом, которая имеет некоторые ограничения.

К сожалению, это позволяет создавать только PDF-файлы.

Если вы хотите открывать и «редактировать» существующие файлы, pdflib предоставляет продукт, который делает это , но стоит ОЧЕНЬ БОЛЬШОЙ.

Документация по расширению PDF / pdflib в PHP немногочисленна (что было отмечено в bugs.php.net) - я рекомендую вам использовать библиотеку Zend.

Если вам нужны действительно простые PDF-файлы, тогда подойдет Zend или FPDF . Однако я считаю, что с ними сложно и неприятно работать. Кроме того, из-за того, как работает API, нет хорошего способа отделить контент от представления от бизнес-логики.

По этой причине я использую dompdf , который автоматически конвертирует HTML и CSS в документы PDF. Вы можете создать шаблон так же, как и для HTML-страницы, и использовать стандартный синтаксис HTML. Вы даже можете включить внешний файл CSS. Библиотека не идеальна, и очень сложная разметка или CSS иногда искажаются, но я не нашел ничего, что работало бы также.

Не знаю, возможен ли это, но он будет работать очень похоже на библиотеку Zend pdf, но вам не нужно загружать кучу дополнительного кода (фреймворк zend). Он просто расширяет FPDF.

http://www.setasign.de/products/pdf-php-solutions/fpdi/

Здесь вы можете сделать то же самое. Загрузите PDF-файл, напишите поверх него, а затем сохраните в новый PDF-файл. В FPDI вы в основном вставляете PDF-файл как изображение, чтобы вы могли поместить все, что захотите, поверх него.

Но опять же, здесь используется FPDF, поэтому, если вы не хотите его использовать, это не сработает.

Я действительно возлагал большие надежды на dompdf (это крутая идея), но проблема позиционирования - главный фактор в моем использовании fpdf. Хотя это утомительно, так как каждый элемент должен быть установлен; это мощно, как и все.

Я кладу изображение под свое рабочее пространство в документе, чтобы разместить макет поверх него. Его всегда было достаточно даже для столбцов (требуется крошечный бит вычисления строки php, но не слишком пьянящий).

Удачи.

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

Существует бесплатный и простой в использовании класс 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');