Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: PDF Document Level Script

by marto (Cardinal)
on Dec 19, 2017 at 11:01 UTC ( #1205850=note: print w/replies, xml ) Need Help??


in reply to PDF Document Level Script

By 'document level script' you mean the JavaScript content PDFs can have? I know that PDF::Reuse can work with this to some degree, I've no idea if CAM::PDF provides this. See also PDF::Reuse::Tutorial.

Update: missing word.

Replies are listed 'Best First'.
Re^2: PDF Document Level Script
by Arik123 (Sexton) on Dec 20, 2017 at 07:49 UTC

    Thanks.... PDF::Reuse works to some degree, but it can handle only functions in the documents level script. I want some of the code there to be executed once the document is opened, and PDF::Reuse doesn't provide that capability. My template PDF did have such code, but PDF::Reuse simply deletes it (it doesn't recognize any JS code that isn't a function).

    So I'm still looking for a better solution. Any ideas? Maybe I can somehow locate that stream object, using CAM::PDF, and manually edit its content?

      As far as better solutions go, I've no further ideas I'm afraid, in order to provide any I'd have to do the same research as you. Feel free to report back with your findings.

        Okay, there is a way to modify document-level JS with CAM::PDF. I created a PDF with document-level JS, and below is how I replace it with a new JS code. Note that your template may work differently. For example, the JS code is stored in a pdf object, which may contain its length, or alternatively contain a reference to another pdf object that contains the length.

        my $pdf = CAM::PDF->new($file); my $p3 = $pdf->getObjValue($pdf->getObjValue($pdf->getObjValue($pdf->g +etRootDict()->{Names}{value}{JavaScript}{value})->{Names}{value}[1]{v +alue})->{JS}{value}); $p3->{StreamData}{value} = <<EO_JS; this.getField("AfterSave1").display = display.hidden; this.getField("AfterSave2").display = display.hidden; this.dirty=false; EO_JS $n = $pdf->dereference(CAM::PDF::Node->new('reference', $p3->{Length}{ +value})->{value}); $n->{value}{value} = length $p3->{StreamData}{value};;

        For some reason, I'm not sure that's the way CAM::PDF was meant to be used...

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1205850]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (4)
As of 2021-01-23 05:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?