我使用FPDF / FPDI将数据库中的pdf与图像合并为PDF的标头。正在搜索解决方案,但尚未找到解决方案,因此我将其发布在这里。
这是我的 viewpdf.php 代码:
<?php
/**
* Simply import all pages and different bounding boxes from different PDF documents.
*/
use setasign\Fpdi;
use setasign\fpdf;
require_once 'config/config.php';
require_once 'vendor/autoload.php';
require_once 'vendor/setasign/fpdf/fpdf.php';
error_reporting(E_ALL);
ini_set('display_errors', 1);
set_time_limit(2);
date_default_timezone_set('UTC');
$start = microtime(true);
$pdf = new Fpdi\Fpdi();
//$pdf = new Fpdi\TcpdfFpdi('L', 'mm', 'A3');
if ($pdf instanceof \TCPDF) {
$pdf->SetProtection(['print'], '', 'owner');
$pdf->setPrintHeader(true);
$pdf->Image('logo-small.png',50,5,100);
$pdf->setPrintFooter(false);
}
$certid= $_GET['id'];
$sql="SELECT pdfblob from subject WHERE certid = '".$certid."' ";
$resultc = $virtual_con->query($sql);
while($row=mysqli_fetch_assoc($resultc)) {
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Type:application/pdf");
header("Content-Transfer-Encoding: binary");
$a = (base64_decode($row["pdfblob"]));
$files = [$a];
foreach ($files as $file) {
$pageCount = $pdf->setSourceFile($file);
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
$pdf->AddPage();
$pageId = $pdf->importPage($pageNo, '/MediaBox');
$pageId = $pdf->importPage($pageNo, Fpdi\PdfReader\PageBoundaries::ART_BOX);
$s = $pdf->useTemplate($pageId, 10, 10, 200);
}
}
$file = uniqid().'.pdf';
$pdf->Output('I', 'simple.pdf');
}
//$pdf->Output('output/'.$file, 'I');
?>
它不会从数据库加载pdf。 “无法加载PDF文档。”
这是我的 upload.php ,用于将PDF存储在数据库中。我的PDF损坏了吗?我一直在使用PDO进行数据库交互,但是这项工作实现了mysqli,因此我需要遵循系统流程。
<?php
include('config/config.php');
session_start();
$certid=$_POST['certid'];
$vendorid=$_POST['vendorid'];
$sid=$_POST['subjectid'];
$target_file = $_FILES["fileToUpload"]["name"];
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
$uploadOk = 1;
if (isset($_POST['submit'])) {
$data = mysqli_real_escape_string($virtual_con,$_FILES['fileToUpload']['tmp_name']);
$data = file_get_contents($data);
$data = base64_encode($data);
$uploadOk = 1;
if (isset($data)) {
$sql="UPDATE `subject` SET `pdfblob`='".$data."' WHERE (`Subjectid`='".$sid."')";
$result=mysqli_query($virtual_con,$sql);
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
$to="subjects.php?subjectid=".$sid."&certid=".$certid."&vendori=".$vendorid;
gotoInterface($to);
}
else{
echo 'Fail to upload file';
}
}
if ($imageFileType !="pdf" ) {
echo "Sorry, PDF is allowed.";
$uploadOk = 0;
}
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
?>
我希望有人可以帮助我处理这段代码。我试图解决em,但仍然无法成功加载输出。我尝试在不使用FPDF的情况下查看PDF,但仍然无法正常工作。我想知道我的代码是否会使BLOB在上传时损坏?
答案 0 :(得分:0)
我将其作为答案而不是评论,因为评论太长了。请按照以下步骤确定问题出在哪里。
$data = mysqli_real_escape_string($virtual_con,$_FILES['fileToUpload']['tmp_name']);
行可能损坏了文件。尝试从本地存储将已知良好的pdf保存到数据库,而不使用上传文件过程,然后尝试再次对其进行解码。如果您可以将其重新转换为pdf,则您的上传文件已将其损坏。否则,请跳至步骤2。我希望这会有所帮助。
答案 1 :(得分:0)
如果您在mysql pdfblob
类型中的列为blob
。
然后我建议您将类型更改为LONGBLOB
类型。
由于MySQL中的BLOB
类型最多只能存储64KB。
如果仍然无法使用,请更改my.ini
max_allowed_packet=500M