PHP добавить логотип в существующий PDF, который хранится в базе данных (MySQL) - PullRequest
0 голосов
/ 03 декабря 2018

Я делаю базовую систему, что сотрудники загружают файл PDF с некоторым описанием, и эти данные хранятся в базе данных MySQL.

Администратор будет просматривать этот PDF и нажимать на утверждение, если все в порядке.

Изображение будет вставлено в файл PDF с логотипом подтверждения.

Я использую для этого классы fpdf и fpdi, мне удается это сделать, если файл PDF хранится по фактическому пути, как показано в коде.ниже.

<?php

use setasign\Fpdi\Fpdi;

require_once('fpdf/fpdf.php');
require_once('fpdi2/src/autoload.php');

// initiate FPDI
$pdf = new Fpdi();
// add a page
$pdf->AddPage();
// set the source file
$pdf->setSourceFile('PdfDocument.pdf');
// import page 1
$tplIdx = $pdf->importPage(1);
// use the imported page and place it at position 10,10 with a width of 100 mm
$pdf->useTemplate($tplIdx, 10, 10, 100);

// now write some text above the imported page
$pdf->SetFont('Helvetica');
$pdf->SetTextColor(255, 0, 0);
$pdf->SetXY(30, 30);
$pdf->Write(0, 'This is just a simple text');

$pdf->Output();

НО, когда я пытаюсь использовать $ pdf-> setSourceFile ($ string) или другой, например, фактический файл (PDF $ содержимое из строки (базы данных) или URL), я не могу сделатьчто.

    // set the source file
//$pageCount = $pdf->setSourceFile("http://localhost/pdf/getpicture.php?fid=2");

$stream = fopen('data:text/plain,' . urlencode("http://localhost/pdf/getPDF.php?fid=2"), 'rb');
//$reader = new SetaPDF_Core_Reader_Stream($stream);
$pageCount = $pdf->setSourceFile($stream);

Мой вопрос: как я могу импортировать PDF из строки MySQL для редактирования с помощью fpdf и fpdi или любых других бесплатных классов PDF.

Примечание: я пытаюсь использовать stream_wrapper_register спока не повезло.как в этой ссылке https://www.setasign.com/support/faq/miscellaneous/using-a-pdf-from-a-php-variable-instead-of-a-file/

Пожалуйста, помогите мне с простым примером, поскольку я не очень знаком с классами PDF.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вы не должны использовать дополнительный HTTP-запрос для доступа к файлу из базы данных!

FPDI 2 позволяет читать из любого источника через класс StreamReader:

// use a resource
$fh = fopen('a/path/to/a.pdf', 'rb');
$pdf->setSourceFile(new StreamReader($fh));
// same as
$pdf->setSourceFile($fh);
// don't forget to call fclose($fh);

// use a path
$path = 'a/path/to/a.pdf';
$pdf->setSourceFile(StreamReader::createByFile($path));
// same as
$pdf->setSourceFile($path);

// use a string
$pdfString = '%%PDF-1.4...';
$pdf->setSourceFile(StreamReader::createByString($pdfString));

Поэтому не вызывайте внешний сценарий, а запросите в вашей базе данных файл PDF и передайте его, например, в виде строки.

PS: Вы не можете редактировать PDF с помощью FPDI !

0 голосов
/ 03 декабря 2018

Я думаю, что источник вашей проблемы в строке:

$stream = fopen('data:text/plain,' . urlencode("http://localhost/pdf/getPDF.php?fid=2"), 'rb');

Функция PHP fopen возвращает указатель файла и не дает вам имя нужного PDF-файла.

Так что позже, когда вы звоните

$pageCount = $pdf->setSourceFile($stream);

$ stream не является строкой с именем файла PDF.

Если ваш http://localhost/pdf/getPDF.php?fid=2 URL-адрес возвращает имя файла PDF,попробуйте получить это значение с помощью file_get_contents следующим образом:

$pdf_file = file_get_contents('http://localhost/pdf/getPDF.php?fid=2');

и затем вызовите

$pdf->setSourceFile($pdf_file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...