groff-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[groff] 01/02: Fix for including pdf v1.7 files.


From: Deri James
Subject: [groff] 01/02: Fix for including pdf v1.7 files.
Date: Sun, 7 Jan 2024 15:26:55 -0500 (EST)

deri pushed a commit to branch master
in repository groff.

commit 7c0358816253817a3594be6402c4b9b7e68db01d
Author: Deri James <deri@chuzzlewit.myzen.co.uk>
AuthorDate: Sun Jan 7 19:51:35 2024 +0000

    Fix for including pdf v1.7 files.
    
        PDF 1.5 introduced object type ObjStm which can contain a bunch of
        objects in its own compressed stream, but there is a restriction
        that if an object has its own stream it cannot be included into
        the ObjStm (i.e. no stream within stream). Gropdf has supported this
        for some years, but it has come to light that some pdfs have a
        "skeleton" object which contains the stream and the rest of the
        object is held in the ObjStm stream.
    
    Also fix incorrect application of patch in bug #65112.
    
        * src/devices/gropdf/gropdf.pl: If a skeleton object exists at
        the top-level and in an ObjStm stream, the two objects should be
        merged.
---
 src/devices/gropdf/gropdf.pl | 57 +++++++++++++++++++++++++++++---------------
 1 file changed, 38 insertions(+), 19 deletions(-)

diff --git a/src/devices/gropdf/gropdf.pl b/src/devices/gropdf/gropdf.pl
index 3f70a4263..14b7b3312 100644
--- a/src/devices/gropdf/gropdf.pl
+++ b/src/devices/gropdf/gropdf.pl
@@ -2413,6 +2413,7 @@ sub LoadPDF
     my (@pdfwds)=split(' ',$pdftxt);
     my $wd;
     my $root;
+    my @ObjStm;
 
     while ($wd=nextwd(\@pdfwds),length($wd))
     {
@@ -2424,24 +2425,7 @@ sub LoadPDF
            $pdf->[$curobj]->{OBJ}=ParsePDFObj(\@pdfwds);
            my $o=$pdf->[$curobj];
 
-           if (ref($o->{OBJ}) eq 'HASH' and exists($o->{OBJ}->{Type}) and 
$o->{OBJ}->{Type} eq '/ObjStm')
-           {
-               LoadStream($o,$pdf);
-               my $pos=$o->{OBJ}->{First};
-               my $s=$o->{STREAM};
-               my @o=split(' ',substr($s,0,$pos));
-               substr($s,0,$pos)='';
-               push(@o,-1,length($s));
-
-               for (my $j=0; $j<=$#o-2; $j+=2)
-               {
-                   my @w=split(' ',substr($s,$o[$j+1],$o[$j+3]-$o[$j+1]));
-                   $pdf->[$o[$j]]->{OBJ}=ParsePDFObj(\@w);
-               }
-
-               $pdf->[$curobj]=undef;
-           }
-
+            push(@ObjStm,$curobj) if (ref($o->{OBJ}) eq 'HASH' and 
exists($o->{OBJ}->{Type}) and $o->{OBJ}->{Type} eq '/ObjStm');
            $root=$curobj if ref($pdf->[$curobj]->{OBJ}) eq 'HASH' and 
exists($pdf->[$curobj]->{OBJ}->{Type}) and $pdf->[$curobj]->{OBJ}->{Type} eq 
'/XRef';
        }
        elsif ($wd eq 'trailer' and !exists($pdf->[0]->{OBJ}))
@@ -2454,6 +2438,25 @@ sub LoadPDF
        }
     }
 
+    foreach my $ObjStm (@ObjStm)
+    {
+        LoadStream($pdf->[$ObjStm],$pdf);
+        my $pos=$pdf->[$ObjStm]->{OBJ}->{First};
+        my $s=$pdf->[$ObjStm]->{STREAM};
+        $s=~s/\%.*?$//m;
+        my @o=split(' ',substr($s,0,$pos));
+        substr($s,0,$pos)='';
+        push(@o,-1,length($s));
+
+        for (my $j=0; $j<=$#o-2; $j+=2)
+        {
+            my @w=split(' ',substr($s,$o[$j+1],$o[$j+3]-$o[$j+1]));
+            
$pdf->[$o[$j]]->{OBJ}=ObjMerge($pdf->[$o[$j]]->{OBJ},ParsePDFObj(\@w));
+        }
+
+        $pdf->[$ObjStm]=undef;
+    }
+
     $pdf->[0]=$pdf->[$root] if !defined($pdf->[0]);
     my $catalog=${$pdf->[0]->{OBJ}->{Root}};
     my $page=FindPage(1,$pdf);
@@ -2530,6 +2533,22 @@ sub LoadPDF
     return([$xonm,$BBox] );
 }
 
+sub ObjMerge
+{
+    my $o1=shift;
+    my $o2=shift;
+
+    return $o1 if !defined($o2);
+    return $o2 if !defined($o1);
+
+    foreach my $k (keys %{$o2})
+    {
+        $o1->{$k}=$o2->{$k};
+    }
+
+    return $o1;
+}
+
 sub LoadStream
 {
     my $o=shift;
@@ -4736,7 +4755,7 @@ sub subs_call
            {
                $c[$#c-4]->[0]=MarkSub("#$c[$#c-4]->[0]") if ($c[$#c-4]->[1]);
            }
-           elsif ($n2==16)      # seac
+           elsif ($n2==6)       # seac
            {
                my $ch=$StdEnc{$c[$#c-2]->[0]};
                my $chf;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]