[PHP][Ghostscript] Gegenereerde thumbnail van PDF roterenY/N

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 22:34
Ej,

Ik ben bezig met een simpele PDF document uploader. Nu is het zo dat de PDF's die ik wil uploaden nogal "in elkaar geprutst" zijn. Dat wil zeggen: er wordt van nogal exotische (niet door GS herkende) paper size gebruik gemaakt.

Basically zijn de PDFs (volgens mij) gemaakt door alles uit een powerpoint pagina te copy/pasten in een Word document wat daarna nog eens naar PDF geconverteerd is. Anyway, the problem at hand:

Als ik een preview thumbnail maak, gebruik ik doorgaans de volgende commando's:
PHP:
1
2
3
4
$cmd = "/usr/bin/gs -q -dNOPAUSE -dBATCH -sDEVICE=jpeg -sOutputFile=$dest $src 2>&1";
exec($cmd);
$cmd = "/usr/bin/convert -resize $width"."x"."$height $dest $dest 2>&1"
exec($cmd);

Dat werkt prima voor standaard (portrait) PDF files, maar niet voor landscape files, en al helemaal niet voor de exotische page size files.

Lees: de gegenereerde thumbnail staat dan "op z'n kant". Dat willen we niet :P

Ik bedacht me dus dat 't handig zou zijn om de page size van (de eerste pagina van) een PDF file uit te lezen, en aan de hand daarvan te bepalen of een PDF in landscape, danwel portrait orientation staat.

PHP:
1
2
3
$outputFile = '/tmp/bbox-'.md5(time());
$inputFile = '/home/thedane/test-portrait.pdf';
$cmd = "/usr/bin/gs -q -dNOPAUSE -dBATCH -dNOPROMPT -dFirstPage=1 -dLastPage=1 -sDEVICE=bbox -dFirstpage=1 -dLastpage=1  $inputFile2>&1 >/dev/null | tee $outputFile ";

Dit genereert een temp file waarin de Bounding Box van de betreffende (eerste) pagina van de PDF file staat. Zoiets dus:
code:
1
2
%%BoundingBox: 88 34 521 757
%%HiResBoundingBox: 88.073997 34.613999 520.649984 756.600024


Je zou dus zeggen dat als je de coordinaten bekijkt je een heel eind zou komen:
PHP:
1
2
3
4
5
6
7
8
9
$buf = file($outputFile );
$coords = explode(' ', $buf[0]);
// width > height ?
if (($coords[3] - $coords[1]) > ($coords[4] - $coords[2])) {
  // PDF in LANDSCAPE
  // rotate file.
} else {
 // PDF in PORTRAIT
}


Maar helaasch, als ik een thumbnail van een 'portrait' pdf genereer, staat deze toch op z'n kant. Hier heb ik dus niks aan. Meest logische vervolgstap: kijken naar de actual page size: in dit geval is dat 9,97" x 7,49" ... Stiekem toch landscape dus.

Maar ik heb geen flauw idee hoe ik deze properties uit de file moet toveren. En this is where you come in ..... ;)


Oh. Ik heb natuurlijk ook de verschillende PDFlib (lite) functies bekeken, maar ik krijg er alleen maar errors mee :X
PHP:
1
2
3
4
5
$pdf = new PDFlib();

$pdf->begin_document($inputFile, "");

echo $pdf->get_value('pagewidth', 0);


code:
1
Fatal error: Uncaught exception 'PDFlibException' with message 'Can't set parameter 'pagewidth' in 'document' scope' in /var/www/gs.php:13 Stack trace: #0 /var/www/gs.php(13): PDFlib->get_value('pagewidth', 0) #1 {main} thrown in /var/www/gs.php on line 13

.. what the ... I said get .... 8)7

Anyway,
Ik zoek dus een mogelijkheid om te bepalen of ik een gegenereerde thumbnail nog (met ImageMagick's convert) moet roteren. De bounding box is geen optie. Page size zou kunnen maar ik weet niet hoe ik die moet achterhalen. Page orientation kan ik al helemaal niet terugvinden ... and I'm running out of options.

Iemand?

edit:

Ohja, als ik de betreffende PDF in een reader (such as Adobe Acrobat) open, verschijnt het document wel correct: niet gekanteld, in een soort van landscape mode.

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Ik snap niet helemaal dat je "if coordinaten" statement niet juist uitpakt. Wat werkt er dan niet? Geeft hij niet de juiste coordinaten bij landscape?

PDFlib documentatie is ook een zooitje zeg. Ik kan geen goede PHP5 documentatie vinden. Alleen een basic hello world ding. Helaas.

Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 22:34
Ja, de coordinaten haalt ie er wel goed uit. Helaasch zijn dat de uiterste coordinaten van de 'tightest box' rondom datgene wat geprint wordt.

Afbeeldingslocatie: http://amath.colorado.edu/documentation/postscript/bb.gif
bron

Dus niet de werkelijke afmetingen van de pagina. Als ik dus niet expliciet weet hoe groot de pagina is (or better yet: of de orientation landscape of portrait is) zal mijn snippet volgens mij gewoon altijd uitgaan van portrait. en als de postscript image dan dus hoger dan breed is, denkt mijn snippet dat 't gewoon portrait is.