X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=createpdf.pl;fp=createpdf.pl;h=78ed00ecddc923625db0ac49e0e0d3d59b67e6b1;hb=3b8b42d3275ec91a2030cc59d259dfddea0ec062;hp=0000000000000000000000000000000000000000;hpb=f3d8f1adad519ac2a398f57d3c4c5223919976b4;p=webpdf diff --git a/createpdf.pl b/createpdf.pl new file mode 100755 index 0000000..78ed00e --- /dev/null +++ b/createpdf.pl @@ -0,0 +1,126 @@ +#! /usr/bin/perl +use CGI; +use POSIX; +use strict; +use File::Temp; + +$ENV{"HOME"} = "/home/cassarossa/itk/sesse/sesse-pdf/"; + +my $cgi = CGI->new; +my $filename = $cgi->param('input'); +my $file = $cgi->upload('input'); + +# It kind of sucks that we just can't get the temporary file name from +# CGI.pm, but OK, here goes :-) + +my $pdf_filename = join('', (0..9, 'A'..'Z', 'a'..'z')[ + rand 62, rand 62, rand 62, rand 62, rand 62, + rand 62, rand 62, rand 62, rand 62, rand 62 +]) . '.pdf'; + +my $pdfopts = ""; +my $psopts = "/setdistillerparams { } /def"; +my $outname; + +if ($cgi->param('preset') eq 'screen') { + $pdfopts = "-dPDFSETTINGS=/screen"; +} elsif ($cgi->param('preset') eq 'ebook') { + $pdfopts = "-dPDFSETTINGS=/ebook"; +} elsif ($cgi->param('preset') eq 'printer') { + $pdfopts = "-dPDFSETTINGS=/printer"; +} elsif ($cgi->param('preset') eq 'prepress') { + $pdfopts = "-dPDFSETTINGS=/prepress"; +} elsif ($cgi->param('preset') eq 'default') { + $psopts = ""; +} + +if ($filename =~ /(.*)\.(?:e?ps|pdf)$/i) { + $outname = "$1.pdf"; + + # Yay, just a round through GhostScript + open PIPE, "| gs $pdfopts -dCompatbilityLevel=1.4 -dNOPAUSE -dPATCH -sDEVICE=pdfwrite -dSAFER -sOutputFile=output/$pdf_filename -c '.setpdfwrite $psopts' -f - >&2" + or die "gs: $!"; + + my ($buf, $ret); + while ($ret = read($file, $buf, 1024)) { + print PIPE $buf; + } + close PIPE; +} elsif ($filename =~ /(.*)\.(bmp|png|jpe?g|xpm)$/i) { + $outname = "$1.pdf"; + + # Run through ImageMagick first of all, then gs + open PIPE, "| convert $2:- ps:- | gs $pdfopts -dCompatbilityLevel=1.4 -dNOPAUSE -dPATCH -sDEVICE=pdfwrite -dSAFER -sOutputFile=output/$pdf_filename -c '.setpdfwrite $psopts' -f - >&2" + or die "convert: $!"; + + my ($buf, $ret); + while ($ret = read($file, $buf, 1024)) { + print PIPE $buf; + } + close PIPE; +} elsif ($filename =~ /(.*)\.txt$/i) { + $outname = "$1.pdf"; + + # Use mpage + open PIPE, "| mpage -da -1 - | gs $pdfopts -dCompatbilityLevel=1.4 -dNOPAUSE -dPATCH -sDEVICE=pdfwrite -dSAFER -sOutputFile=output/$pdf_filename -c '.setpdfwrite $psopts' -f - >&2" + or die "convert: $!"; + + my ($buf, $ret); + while ($ret = read($file, $buf, 1024)) { + print PIPE $buf; + } + close PIPE; +} elsif ($filename =~ /(.*)\.(doc|xls|ppt)$/i) { + $outname = "$1.pdf"; + my $ext = $2; + + # Oh my, OpenOffice + open DOC, ">output/$pdf_filename.$ext" + or die "output/$pdf_filename.$ext: $!"; + my ($buf, $ret); + while ($ret = read($file, $buf, 1024)) { + print DOC $buf; + } + close DOC; + + # Create PostScript from OOo :-) + system("/usr/lib/openoffice/program/soffice -display :25 -headless -pt pdf /home/cassarossa/itk/sesse/public_html/pdf/output/$pdf_filename.$ext"); + + system("gs $pdfopts -dCompatbilityLevel=1.4 -dNOPAUSE -dPATCH -sDEVICE=pdfwrite -dSAFER -sOutputFile=output/$pdf_filename -c '.setpdfwrite $psopts' -f - < output/$pdf_filename.pdf >&2"); +} elsif ($filename =~ /(.*)\.(c|cc|cpp|cs|h|py|rb|pl|diff|patch|js|php[1-5]?|hs|f|f90|java|css|sql|l|y|s?ml|sh|awk|m|v)$/i) { + $outname = "$1.pdf"; + my $ext = $2; + + open DOC, ">output/$pdf_filename.$ext" + or die "output/$pdf_filename.$ext: $!"; + my ($buf, $ret); + while ($ret = read($file, $buf, 1024)) { + print DOC $buf; + } + close DOC; + + (my $sanitized_filename = $filename) =~ tr/a-zA-Z0-9./_/c; + + # This is just perverse :-P + system("vim -Z -R +\"set printheader=\%<$sanitized_filename\%h\%m\%=Page\\ \%N\" +\"ha >/home/cassarossa/itk/sesse/public_html/pdf/output/$pdf_filename.ps\" +:q output/$pdf_filename.$ext"); + + system("gs $pdfopts -dCompatbilityLevel=1.4 -dNOPAUSE -dPATCH -sDEVICE=pdfwrite -dSAFER -sOutputFile=output/$pdf_filename -c '.setpdfwrite $psopts' -f - < output/$pdf_filename.ps >&2"); +} else { + print <<"EOF"; +Content-type: text/html + +Error +

Error

+

You sent an unknown file type.

+ +EOF + exit; +} + +my $size = -s "output/$pdf_filename"; + +print "Content-type: application/pdf\n"; +print "Content-disposition: attachment; filename=\"$outname\"\n"; # FIXME: XSS problems? +print "Content-length: $size\n\n"; + +system("cat output/$pdf_filename"); # yuck?