Files
decpdf.site/lib/PDF.php
2026-01-18 00:53:18 +00:00

146 lines
3.0 KiB
PHP
Executable File

<?php
require_once(__DIR__ . "/File.php");
define("PDF_SCREEN", 0);
define("PDF_EBOOK", 1);
define("PDF_PRINT", 2);
define("PDF_PREPRESS", 3);
class PDF extends File {
private $_force_download = false;
private $_fake_filename = null;
public function __construct($f) {
parent::__construct($f);
}
public function extract_page($page, $file, $dpi = 300) {
$m = Config::get("MAGICK");
$p = new Process($m);
$p->arg("-density"); $p->arg($dpi);
$p->arg(sprintf("%s[%d]", $this->path(), $page));
$p->arg("-alpha"); $p->arg("remove");
$p->arg($file);
$rv = $p->execute();
if ($rv != 0) {
$img = new Image(640, 640);
$y = 40;
$x = 10;
$b = $img->color(255,255,255);
$f = $img->color(0, 0, 0);
$img->clear($b);
$e = implode("\n", $p->stderr());
$e = wordwrap($e, 80);
$e = explode("\n", $e);
foreach ($e as $l) {
$img->text($x, $y, $l, $f, 3);
$y += 20;
}
$img->save($file, "image/jpeg");
return $img;
}
return new Image($file);
}
public function force_download() {
$this->_force_download = true;
}
public function fake_filename($f) {
$this->_fake_filename = $f;
}
public function emit() {
$filename = $this->_fake_filename;
if ($filename == null) {
$filename = $this->basename();
}
if ($this->_force_download) {
$this->set_header("Content-Type", "application/octet-stream");
$this->set_header("Cache-Control", "public, max-age=31560000, immutable");
$this->set_header("Content-Disposition", "attachment; filename=\"$filename\"");
} else {
$this->set_header("Content-Type", "application/pdf");
$this->set_header("Cache-Control", "public, max-age=31560000, immutable");
$this->set_header("Content-Disposition", "inline; filename=\"$filename\"");
}
parent::emit();
}
public function info() {
$infolines = array();
$info = array();
$proc = new Process("pdfinfo");
$proc->arg($this->path());
$proc->execute();
$infolines = $proc->stdout();
foreach ($infolines as $line) {
if (preg_match('/^([^:]+):\s+(.*)$/', $line, $m)) {
$info[$m[1]] = $m[2];
}
}
return $info;
}
public function geminiOverview($verbose=false) {
$g = new Gemini();
$g->verbose = $verbose;
try {
return $g->geminiOverview($this);
} catch (Exception $e) {
throw $e;
}
}
public function recompress($dest, $size=PDF_SCREEN) {
$proc = new Process("gs");
$proc->arg("-sDEVICE=pdfwrite");
$proc->arg("-dCompatibilityLevel=1.6");
switch ($size) {
case PDF_SCREEN:
$proc->arg("-dPDFSETTINGS=/screen");
break;
case PDF_EBOOK:
$proc->arg("-dPDFSETTINGS=/ebook");
break;
case PDF_PRINT:
$proc->arg("-dPDFSETTINGS=/printer");
break;
case PDF_PREPRESS:
$proc->arg("-dPDFSETTINGS=/prepress");
break;
}
$proc->arg("-dNOPAUSE");
$proc->arg("-dQUIET");
$proc->arg("-dBATCH");
$proc->arg("-sOutputFile=" . $dest);
$proc->arg($this->path());
$rv = $proc->execute();
if ($rv == 0) {
return new PDF($dest);
}
return false;
}
}