in reply to printing metacpan

So I don't understand what your problem is regarding printing the page to PDF, but here is something really quickly thrown together to generate a PDF from the command line, I'll fix it up properly and post it in Cool Uses for Perl.

This requires PDF::WebKit (which uses wkhtmltopdf) and Mojo::UserAgent to ensure the target module is on metacpan. wkhtmltopdf won't work headless (without patches they say), but This works reasonably well for me, as I said, I'll tidy it up later today hopefully.

Usage: podtopdf Module::Name generates a pdf called Module-Name.pod.pdf:

#!/usr/bin/perl use strict; use warnings; use PDF::WebKit; use Mojo::UserAgent; # Change to Letter, or whatever my $pagesize = 'A4'; # URLs for metacpan API and POD my $metacpanapi = 'https://fastapi.metacpan.org/v1/module/'; my $metacpanpod = 'https://metacpan.org/pod/'; my ($module) = @ARGV or die "no module specified: $0 Module::Name"; my $ua = Mojo::UserAgent->new(); # check metacpan for distribution my $dist = $ua->get( $metacpanapi.$module )->res->json->{distribution} or die "Can't find $module. Are you sure it exists in the CPAN?\n"; # default filename is distname.pod.pdf my $pdffilename = $dist . '.pod.pdf'; $dist =~ s/-/::/g; $metacpanpod .= $dist; # create PDF my $kit = PDF::WebKit->new( $metacpanpod, page_size => $pagesize ); my $pdf = $kit->to_pdf; # save the PDF to a file

Update: At time of writing wkhtmltopdf did not work headless, it now does.

Replies are listed 'Best First'.
Re^2: printing metacpan
by Tux (Canon) on Dec 10, 2019 at 10:52 UTC

    THANK YOU! This fixed a lot of my headaches. I wrote html2pdf.pl with this as base, which works with files as well as with URL's:

    #!/usr/bin/perl use 5.14.2; use warnings; our $VERSION = "0.01 - 20191210"; our $CMD = $0 =~ s{.*/}{}r; sub usage { my $err = shift and select STDERR; say "usage: $CMD [-p A4] [-f] [-o file.pdf] file.html"; say " -p size --page-size=size Set page size. Default = A4" +; say " -o out --out=out Set ouput file name. Default + = s{.html\$}{.pdf}"; say " -f --force Overwrite out if exists"; exit $err; } # usage use Data::Peek; use PDF::WebKit; use Getopt::Long qw(:config bundling); GetOptions ( "help|?" => sub { usage (0); }, "V|version" => sub { say "$CMD [$VERSION]"; exit 0; }, "f|force!" => \ my $opt_f, "p|page-size=s" => \(my $page_size = "A4"), "o|out|pdf=s" => \ my $pdff, "v|verbose:1" => \(my $opt_v = 0), ) or usage (1); my $html = shift or usage (1); $pdff ||= $html =~ s{\.html?$}{.pdf}ri =~ s{.*/}{}r; -s $pdff && !$opt_f and die "$pdff already exists\n"; unlink $pdff; PDF::WebKit->new ($html, page_size => $page_size)->to_file ($pdff);

    Images, colors *and* fonts are correct, which I cannot say for the very broken htmldoc and html2ps tools.


    Enjoy, Have FUN! H.Merijn

      Very happy this gave you a pointer to build on, and now that this can run headless it is obviously far more useful :)