From 3b8b42d3275ec91a2030cc59d259dfddea0ec062 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 6 Aug 2005 23:11:14 +0000 Subject: [PATCH] Added first files. --- createpdf.pl | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++ index.html | 99 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 225 insertions(+) create mode 100755 createpdf.pl create mode 100644 index.html 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? diff --git a/index.html b/index.html new file mode 100644 index 0000000..2119e13 --- /dev/null +++ b/index.html @@ -0,0 +1,99 @@ + + + + + PDF converter : sesse.net + + + + + + +

PDF converter

+ +
+
+

Last updated

+

August 5th, 2005

+
+ + +
+ +
+ + + + + + + + + + + + +
File:
PDF preset: + +
+ +
+
+ +

This is an “anything to PDF” converter, not unlike what you get + from Adobe's PDF Online service, + but completely free and running entirely on free software. It is also + completely without any kind of warranty or uptime guarantees -- I'll + try to do my best keeping it up, but in case people start dumping + multi-gigabyte jobs etc. on it regularily I might just not be able to + do that. Please be nice :-)

+ +

Note that there is minimal security involved; if I feel like it, I + might even take a look at what people are processing. Do not submit + any sensitive data!

+ +

The converter is currently based on GPL + GhostScript 8.01 (yes, a bit old); everything is pushed through it in one form or the + other (if only for image recompression etc.). The PDF presets match + exactly those in GhostScript itself -- see the + table + of options for more details. (Note that anything except “default” + will override whatever input parameters there are in the input PostScript + file.)

+ +

The converter can currently handle the following formats, autodetected + by file extension only:

+ + + +

If somebody knows a good way of getting a Gecko-based browser to + convert from an URL or HTML file to PostScript (on the command line), + please let me know; I'd guess HTML would be the most-wanted format + missing. :-)

+ + + -- 2.39.2