- Add videodb PHP/MySQL media collection manager (Blu-ray, DVD, CD) - Dockerfile: PHP 8.1 + Apache with GD/mysqli/exif extensions - docker-compose.yml: app on port 6761 + MySQL 8.0 with health checks - docker-entrypoint.sh: auto-generates config.inc.php from env vars, waits for MySQL, initializes DB schema idempotently - init-db.php: CLI schema installer using app's own prefix_query() logic - Persistent volumes for DB, cache, and cover images Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
170 lines
4.7 KiB
PHP
170 lines
4.7 KiB
PHP
<?php
|
|
/**
|
|
* FPDF extension to lower memory consumption
|
|
*
|
|
* @package Lib
|
|
*
|
|
* @author Olivier <oliver@fpdf.org>
|
|
* @author Andreas Goetz <cpuidle@gmx.de>
|
|
* @license Freeware
|
|
* @version $Id: fpdf2file.php,v 1.3 2010/04/04 08:51:06 andig2 Exp $
|
|
* @version updated for fpdf v1.8 or above copperhead 2022/12/18
|
|
* @override for FPDF_VERSION constant added copperhead 2023/01/05
|
|
*/
|
|
|
|
//not requied by vidoeDB
|
|
//require('fpdf.php');
|
|
|
|
class FPDF2File extends FPDF
|
|
{
|
|
protected $f;
|
|
|
|
function Open($file='doc.pdf')
|
|
{
|
|
// The FPDF_VERSION constant was replaced by a class constant in FPDF V1.85
|
|
// FPDF2FILE extension to lower memory consumption not yet updated @ 2023/01/05
|
|
// if(FPDF_VERSION<'1.8')
|
|
if(self::VERSION<'1.8')
|
|
$this->Error('Version 1.8 or above is required by this extension');
|
|
$this->f=fopen($file,'wb');
|
|
if(!$this->f)
|
|
$this->Error('Unable to create output file: '.$file);
|
|
$this->_putheader();
|
|
}
|
|
|
|
function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
|
|
{
|
|
if(!isset($this->images[$file]))
|
|
{
|
|
//Retrieve only meta-information
|
|
$a=getimagesize($file);
|
|
if($a===false)
|
|
$this->Error('Missing or incorrect image file: '.$file);
|
|
$this->images[$file]=array('w'=>$a[0],'h'=>$a[1],'type'=>$a[2],'i'=>count($this->images)+1);
|
|
}
|
|
parent::Image($file,$x,$y,$w,$h,$type,$link);
|
|
}
|
|
|
|
function Output($dest='', $name='', $isUTF8=false)
|
|
{
|
|
if($this->state<3)
|
|
$this->Close();
|
|
}
|
|
|
|
function _endpage()
|
|
{
|
|
parent::_endpage();
|
|
//Write page to file
|
|
$this->_putstreamobject($this->pages[$this->page]);
|
|
unset($this->pages[$this->page]);
|
|
}
|
|
|
|
function _getoffset()
|
|
{
|
|
return ftell($this->f);
|
|
}
|
|
|
|
function _put($s)
|
|
{
|
|
fwrite($this->f,$s."\n",strlen($s)+1);
|
|
}
|
|
|
|
function _putimages()
|
|
{
|
|
foreach(array_keys($this->images) as $file)
|
|
{
|
|
$type=$this->images[$file]['type'];
|
|
if($type==1)
|
|
$info=$this->_parsegif($file);
|
|
elseif($type==2)
|
|
$info=$this->_parsejpg($file);
|
|
elseif($type==3)
|
|
$info=$this->_parsepng($file);
|
|
else
|
|
$this->Error('Unsupported image type: '.$file);
|
|
$this->_putimage($info);
|
|
$this->images[$file]['n']=$info['n'];
|
|
unset($info);
|
|
}
|
|
}
|
|
|
|
function _putpages()
|
|
{
|
|
$nb=$this->page;
|
|
for($n=1;$n<=$nb;$n++)
|
|
$this->PageInfo[$n]['n']=$this->n+$n;
|
|
if($this->DefOrientation=='P')
|
|
{
|
|
$wPt=$this->DefPageSize[0]*$this->k;
|
|
$hPt=$this->DefPageSize[1]*$this->k;
|
|
}
|
|
else
|
|
{
|
|
$wPt=$this->DefPageSize[1]*$this->k;
|
|
$hPt=$this->DefPageSize[0]*$this->k;
|
|
}
|
|
//Page objects
|
|
for($n=1;$n<=$nb;$n++)
|
|
{
|
|
$this->_newobj();
|
|
$this->_put('<</Type /Page');
|
|
$this->_put('/Parent 1 0 R');
|
|
if(isset($this->PageInfo[$n]['size']))
|
|
$this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageInfo[$n]['size'][0],$this->PageInfo[$n]['size'][1]));
|
|
if(isset($this->PageInfo[$n]['rotation']))
|
|
$this->_put('/Rotate '.$this->PageInfo[$n]['rotation']);
|
|
$this->_put('/Resources 2 0 R');
|
|
if(isset($this->PageLinks[$n]))
|
|
{
|
|
//Links
|
|
$annots='/Annots [';
|
|
foreach($this->PageLinks[$n] as $pl)
|
|
{
|
|
$rect=sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
|
|
$annots.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
|
|
if(is_string($pl[4]))
|
|
$annots.='/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
|
|
else
|
|
{
|
|
$l=$this->links[$pl[4]];
|
|
if(isset($this->PageInfo[$l[0]]['size']))
|
|
$h=$this->PageInfo[$l[0]]['size'][1];
|
|
else
|
|
$h=$hpt;
|
|
$annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',$this->PageInfo[$l[0]]['n'],$h-$l[1]*$this->k);
|
|
}
|
|
}
|
|
$this->_put($annots.']');
|
|
}
|
|
if($this->WithAlpha)
|
|
$this->_put('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
|
|
$this->_put('/Contents '.(2+$n).' 0 R>>');
|
|
$this->_put('endobj');
|
|
}
|
|
//Pages root
|
|
$this->offsets[1]=$this->_getoffset();
|
|
$this->_put('1 0 obj');
|
|
$this->_put('<</Type /Pages');
|
|
$kids='/Kids [';
|
|
for($n=1;$n<=$nb;$n++)
|
|
$kids.=(2+$nb+$n).' 0 R ';
|
|
$this->_put($kids.']');
|
|
$this->_put('/Count '.$nb);
|
|
$this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt));
|
|
$this->_put('>>');
|
|
$this->_put('endobj');
|
|
}
|
|
|
|
function _putheader()
|
|
{
|
|
if($this->_getoffset()==0)
|
|
parent::_putheader();
|
|
}
|
|
|
|
function _enddoc()
|
|
{
|
|
parent::_enddoc();
|
|
fclose($this->f);
|
|
}
|
|
}
|
|
?>
|