perl-embperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Stepanov <michaelstepa...@francoudi.com>
Subject Re: pdf generation
Date Mon, 31 Jan 2005 13:40:16 GMT
Ben Kim wrote:
> Dear list,
> 
> 1. pdf generation 
> I'd like to learn what people use to generate pdf files. I want to
> create pdf from an epl page, with all data from the database.

We use Embperl and htmldoc to build PDF files. A fuctionality is 
implemented into Perl module. There is a possibility to send built PDF
file in the browser plugin:

use Embperl;
use mod_perl;
use File::Temp qw/ tempfile /;

my $r = $Embperl::req_rec;

my $body;
Embperl::Execute( { inputfile   => <your/Embperl/template>,
                     param       => [ <some parameters> ],
                     output      => \$html } );

my($fh, $fname) = tempfile('file_XXXXXXXX', SUFFIX => '.pdf', DIR => 
yout/tmp/dir);;

open(WRITE, "|htmldoc -t pdf14 -f $fname $msg --fontsize 10  --header 
... --footer t/D --webpage --size A4 -") or die "Couldn't open htmldoc: 
$! $?";
print WRITE $$html;
close WRITE or warn "Some error was generated in the pipe. Error :$! ";

# Send PDF file into browser plugin.
if($mod_perl::VERSION >= 1.99) {
     $r->content_type('application/pdf');
     $r->sendfile($fname);
} else {
     eval "use Apache::File;";
     open $fh, $fname or die "Cannot open file $fname: $!!";
     # Send created file to HTTP response
     $r->headers_out->set('Accept-Ranges' => 'bytes');
     $r->content_type('application/pdf');
     $r->headers_out->set('Content-Disposition', 'inline; 
filename=report.pdf');
     $r->headers_out->set('Connection' => 'close');
     $r->set_content_length(-s $fname);
     $r->set_etag();
     $range_req = $r->set_byterange();
     $r->send_http_header;
     if( $range_req ) {
         while( my($offset, $length)=$r->each_byterange) {
             seek $fh, $offset, 0;
             $r->send_fd($fh, $length)
         }
     } else {
         $r->send_fd($fh);
     }
}

To produce complicated PDF documents we use a following approach:
1) Make document template with some markers in text editor (MS Word, for 
example);
2) Convert the template into PostScript (just print it to the file using 
PostScript printer);
3) Replace markers by real data using Perl regexp;
4) Convert PostScript file to PDF using utility ps2pdf.

> 
> 2. Teeing the output to browser / filesystem
> 
> Related with this, I'd also like to know whether there's a way to print
> the html results of the database-driven epl page into a static html file.

If you need to save Embperl output to the file do it using some 
temporary directory where apache can right to write.

> 
> The problem I have is that the epl pages are protected, and I don't want
> to mess with session id and other auth tokens when I use htmldoc. So it
> will have to output the result sent to the browser  also to the filesystem.
> (Tee'd.)

Hope it will be useful for you.

> 
> 
> Regards,
> 
> Ben Kim
> Systems Administrator/Database Developer
> College of Education 
> Texas A&M University
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: embperl-unsubscribe@perl.apache.org
> For additional commands, e-mail: embperl-help@perl.apache.org
> 
> 


-- 
Best regards,
Michael Stepanov
Perl/Linux Developer
www.stepanoff.org

---------------------------------------------------------------------
To unsubscribe, e-mail: embperl-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-help@perl.apache.org


Mime
View raw message