Commit 78a7193fe2a5d14ca422407b35de9302f01d62ec

Authored by Jay Berkenbilt
1 parent 1ad6451e

Preserve annotations that inherently lack appearance (fixes #1039)

...when flattening annotations. This includes /Link, /Popup,
and /Projection.
ChangeLog
  1 +2023-12-29 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * When flattening annotations, preserve annotations without any
  4 + appearance information at all, such as types /Link, /Popup, and
  5 + /Projection. Fixes #1039.
  6 +
1 2023-12-25 Jay Berkenbilt <ejb@ql.org> 7 2023-12-25 Jay Berkenbilt <ejb@ql.org>
2 8
3 * Detect overlong UTF-8 in the UTF-8 decoder, and fix detection of 9 * Detect overlong UTF-8 in the UTF-8 decoder, and fix detection of
libqpdf/QPDFPageDocumentHelper.cc
@@ -125,11 +125,12 @@ QPDFPageDocumentHelper::flattenAnnotationsForPage( @@ -125,11 +125,12 @@ QPDFPageDocumentHelper::flattenAnnotationsForPage(
125 ++next_fx; 125 ++next_fx;
126 } 126 }
127 new_content += content; 127 new_content += content;
128 - } else if (process) {  
129 - // If an annotation has no appearance stream, just drop the annotation when flattening.  
130 - // This can happen for unchecked checkboxes and radio buttons, popup windows associated  
131 - // with comments that aren't visible, and other types of annotations that aren't  
132 - // visible. 128 + } else if (process && !aoh.getAppearanceDictionary().isNull()) {
  129 + // If an annotation has no selected appearance stream, just drop the annotation when
  130 + // flattening. This can happen for unchecked checkboxes and radio buttons, popup windows
  131 + // associated with comments that aren't visible, and other types of annotations that
  132 + // aren't visible. Annotations that have no appearance streams at all, such as Link,
  133 + // Popup, and Projection, should be preserved.
133 QTC::TC("qpdf", "QPDFPageDocumentHelper ignore annotation with no appearance"); 134 QTC::TC("qpdf", "QPDFPageDocumentHelper ignore annotation with no appearance");
134 } else { 135 } else {
135 new_annots.push_back(aoh.getObjectHandle()); 136 new_annots.push_back(aoh.getObjectHandle());
manual/release-notes.rst
@@ -38,6 +38,12 @@ Planned changes for future 12.x (subject to change): @@ -38,6 +38,12 @@ Planned changes for future 12.x (subject to change):
38 38
39 .. x.y.z: not yet released 39 .. x.y.z: not yet released
40 40
  41 +11.7.1: not yet released
  42 + - Bug fixes:
  43 +
  44 + - When flattening annotations, preserve hyperlinks and other
  45 + annotations that inherently have no appearance information.
  46 +
41 11.7.0: December 24, 2023 47 11.7.0: December 24, 2023
42 - Bug fixes: 48 - Bug fixes:
43 49
qpdf/qtest/qpdf/appearances-a-more.pdf
No preview for this file type
qpdf/qtest/qpdf/appearances-a-more2.pdf
No preview for this file type
qpdf/qtest/qpdf/appearances-a-more3.pdf
No preview for this file type
qpdf/qtest/qpdf/appearances-a.pdf
No preview for this file type
qpdf/qtest/qpdf/comment-annotation-direct-out.pdf
@@ -22,10 +22,13 @@ endobj @@ -22,10 +22,13 @@ endobj
22 %% Page 1 22 %% Page 1
23 3 0 obj 23 3 0 obj
24 << 24 <<
25 - /Contents [ 25 + /Annots [
26 4 0 R 26 4 0 R
27 - 6 0 R  
28 - 8 0 R 27 + ]
  28 + /Contents [
  29 + 5 0 R
  30 + 7 0 R
  31 + 9 0 R
29 ] 32 ]
30 /MediaBox [ 33 /MediaBox [
31 0 34 0
@@ -36,35 +39,51 @@ endobj @@ -36,35 +39,51 @@ endobj
36 /Parent 2 0 R 39 /Parent 2 0 R
37 /Resources << 40 /Resources <<
38 /Font << 41 /Font <<
39 - /F1 10 0 R 42 + /F1 11 0 R
40 >> 43 >>
41 - /ProcSet 11 0 R 44 + /ProcSet 12 0 R
42 /XObject << 45 /XObject <<
43 - /Fxo1 12 0 R 46 + /Fxo1 13 0 R
44 >> 47 >>
45 >> 48 >>
46 /Type /Page 49 /Type /Page
47 >> 50 >>
48 endobj 51 endobj
49 52
50 -%% Contents for page 1  
51 4 0 obj 53 4 0 obj
52 << 54 <<
53 - /Length 5 0 R 55 + /F 28
  56 + /Open false
  57 + /Parent 15 0 R
  58 + /Rect [
  59 + 612
  60 + 601
  61 + 792
  62 + 721
  63 + ]
  64 + /Subtype /Popup
  65 + /Type /Annot
  66 +>>
  67 +endobj
  68 +
  69 +%% Contents for page 1
  70 +5 0 obj
  71 +<<
  72 + /Length 6 0 R
54 >> 73 >>
55 stream 74 stream
56 q 75 q
57 endstream 76 endstream
58 endobj 77 endobj
59 78
60 -5 0 obj 79 +6 0 obj
61 2 80 2
62 endobj 81 endobj
63 82
64 %% Contents for page 1 83 %% Contents for page 1
65 -6 0 obj 84 +7 0 obj
66 << 85 <<
67 - /Length 7 0 R 86 + /Length 8 0 R
68 >> 87 >>
69 stream 88 stream
70 BT 89 BT
@@ -75,14 +94,14 @@ ET @@ -75,14 +94,14 @@ ET
75 endstream 94 endstream
76 endobj 95 endobj
77 96
78 -7 0 obj 97 +8 0 obj
79 44 98 44
80 endobj 99 endobj
81 100
82 %% Contents for page 1 101 %% Contents for page 1
83 -8 0 obj 102 +9 0 obj
84 << 103 <<
85 - /Length 9 0 R 104 + /Length 10 0 R
86 >> 105 >>
87 stream 106 stream
88 107
@@ -94,11 +113,11 @@ Q @@ -94,11 +113,11 @@ Q
94 endstream 113 endstream
95 endobj 114 endobj
96 115
97 -9 0 obj 116 +10 0 obj
98 35 117 35
99 endobj 118 endobj
100 119
101 -10 0 obj 120 +11 0 obj
102 << 121 <<
103 /BaseFont /Helvetica 122 /BaseFont /Helvetica
104 /Encoding /WinAnsiEncoding 123 /Encoding /WinAnsiEncoding
@@ -108,14 +127,14 @@ endobj @@ -108,14 +127,14 @@ endobj
108 >> 127 >>
109 endobj 128 endobj
110 129
111 -11 0 obj 130 +12 0 obj
112 [ 131 [
113 /PDF 132 /PDF
114 /Text 133 /Text
115 ] 134 ]
116 endobj 135 endobj
117 136
118 -12 0 obj 137 +13 0 obj
119 << 138 <<
120 /BBox [ 139 /BBox [
121 0 140 0
@@ -136,7 +155,7 @@ endobj @@ -136,7 +155,7 @@ endobj
136 >> 155 >>
137 /Subtype /Form 156 /Subtype /Form
138 /Type /XObject 157 /Type /XObject
139 - /Length 13 0 R 158 + /Length 14 0 R
140 >> 159 >>
141 stream 160 stream
142 q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b 161 q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
@@ -144,31 +163,63 @@ endstream @@ -144,31 +163,63 @@ endstream
144 endobj 163 endobj
145 164
146 %QDF: ignore_newline 165 %QDF: ignore_newline
147 -13 0 obj 166 +14 0 obj
148 928 167 928
149 endobj 168 endobj
150 169
  170 +15 0 obj
  171 +<<
  172 + /AP <<
  173 + /N 13 0 R
  174 + >>
  175 + /C [
  176 + 1
  177 + 1
  178 + 0
  179 + ]
  180 + /CA 1
  181 + /Contents (Salad)
  182 + /CreationDate (D:20181231235455Z00'00)
  183 + /F 28
  184 + /M (D:20181231235455Z00'00)
  185 + /Name /Comment
  186 + /P 3 0 R
  187 + /Popup 4 0 R
  188 + /Rect [
  189 + 235
  190 + 703
  191 + 253
  192 + 721
  193 + ]
  194 + /Subtype /Text
  195 + /T (Jay Berkenbilt)
  196 + /Type /Annot
  197 +>>
  198 +endobj
  199 +
151 xref 200 xref
152 -0 14 201 +0 16
153 0000000000 65535 f 202 0000000000 65535 f
154 0000000025 00000 n 203 0000000025 00000 n
155 0000000079 00000 n 204 0000000079 00000 n
156 0000000161 00000 n 205 0000000161 00000 n
157 -0000000450 00000 n  
158 -0000000507 00000 n  
159 -0000000548 00000 n  
160 -0000000647 00000 n  
161 -0000000689 00000 n  
162 -0000000779 00000 n  
163 -0000000798 00000 n  
164 -0000000917 00000 n  
165 -0000000953 00000 n  
166 -0000002197 00000 n 206 +0000000453 00000 n
  207 +0000000616 00000 n
  208 +0000000673 00000 n
  209 +0000000714 00000 n
  210 +0000000813 00000 n
  211 +0000000855 00000 n
  212 +0000000946 00000 n
  213 +0000000966 00000 n
  214 +0000001085 00000 n
  215 +0000001121 00000 n
  216 +0000002365 00000 n
  217 +0000002386 00000 n
167 trailer << 218 trailer <<
168 /Root 1 0 R 219 /Root 1 0 R
169 - /Size 14 220 + /Size 16
170 /ID [<c5b1999a07a3fdcd0c04cfeed299c25a><31415926535897932384626433832795>] 221 /ID [<c5b1999a07a3fdcd0c04cfeed299c25a><31415926535897932384626433832795>]
171 >> 222 >>
172 startxref 223 startxref
173 -2218 224 +2716
174 %%EOF 225 %%EOF
qpdf/qtest/qpdf/comment-annotation-out.pdf
@@ -22,10 +22,11 @@ endobj @@ -22,10 +22,11 @@ endobj
22 %% Page 1 22 %% Page 1
23 3 0 obj 23 3 0 obj
24 << 24 <<
  25 + /Annots 4 0 R
25 /Contents [ 26 /Contents [
26 - 4 0 R  
27 - 6 0 R  
28 - 8 0 R 27 + 5 0 R
  28 + 7 0 R
  29 + 9 0 R
29 ] 30 ]
30 /MediaBox [ 31 /MediaBox [
31 0 32 0
@@ -36,35 +37,41 @@ endobj @@ -36,35 +37,41 @@ endobj
36 /Parent 2 0 R 37 /Parent 2 0 R
37 /Resources << 38 /Resources <<
38 /Font << 39 /Font <<
39 - /F1 10 0 R 40 + /F1 11 0 R
40 >> 41 >>
41 - /ProcSet 11 0 R 42 + /ProcSet 12 0 R
42 /XObject << 43 /XObject <<
43 - /Fxo1 12 0 R 44 + /Fxo1 13 0 R
44 >> 45 >>
45 >> 46 >>
46 /Type /Page 47 /Type /Page
47 >> 48 >>
48 endobj 49 endobj
49 50
50 -%% Contents for page 1  
51 4 0 obj 51 4 0 obj
  52 +[
  53 + 15 0 R
  54 +]
  55 +endobj
  56 +
  57 +%% Contents for page 1
  58 +5 0 obj
52 << 59 <<
53 - /Length 5 0 R 60 + /Length 6 0 R
54 >> 61 >>
55 stream 62 stream
56 q 63 q
57 endstream 64 endstream
58 endobj 65 endobj
59 66
60 -5 0 obj 67 +6 0 obj
61 2 68 2
62 endobj 69 endobj
63 70
64 %% Contents for page 1 71 %% Contents for page 1
65 -6 0 obj 72 +7 0 obj
66 << 73 <<
67 - /Length 7 0 R 74 + /Length 8 0 R
68 >> 75 >>
69 stream 76 stream
70 BT 77 BT
@@ -75,14 +82,14 @@ ET @@ -75,14 +82,14 @@ ET
75 endstream 82 endstream
76 endobj 83 endobj
77 84
78 -7 0 obj 85 +8 0 obj
79 44 86 44
80 endobj 87 endobj
81 88
82 %% Contents for page 1 89 %% Contents for page 1
83 -8 0 obj 90 +9 0 obj
84 << 91 <<
85 - /Length 9 0 R 92 + /Length 10 0 R
86 >> 93 >>
87 stream 94 stream
88 95
@@ -94,11 +101,11 @@ Q @@ -94,11 +101,11 @@ Q
94 endstream 101 endstream
95 endobj 102 endobj
96 103
97 -9 0 obj 104 +10 0 obj
98 35 105 35
99 endobj 106 endobj
100 107
101 -10 0 obj 108 +11 0 obj
102 << 109 <<
103 /BaseFont /Helvetica 110 /BaseFont /Helvetica
104 /Encoding /WinAnsiEncoding 111 /Encoding /WinAnsiEncoding
@@ -108,14 +115,14 @@ endobj @@ -108,14 +115,14 @@ endobj
108 >> 115 >>
109 endobj 116 endobj
110 117
111 -11 0 obj 118 +12 0 obj
112 [ 119 [
113 /PDF 120 /PDF
114 /Text 121 /Text
115 ] 122 ]
116 endobj 123 endobj
117 124
118 -12 0 obj 125 +13 0 obj
119 << 126 <<
120 /BBox [ 127 /BBox [
121 0 128 0
@@ -136,7 +143,7 @@ endobj @@ -136,7 +143,7 @@ endobj
136 >> 143 >>
137 /Subtype /Form 144 /Subtype /Form
138 /Type /XObject 145 /Type /XObject
139 - /Length 13 0 R 146 + /Length 14 0 R
140 >> 147 >>
141 stream 148 stream
142 q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b 149 q 1 1 1 rg 0 i 1 w 4 M 1 j 0 J []0 d /GS0 gs 1 0 0 1 9 5.0908 cm 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c h f Q 0 G 1 1 0 rg 0 i 0.60 w 4 M 1 j 0 J []0 d 1 1 0 rg 0 G 0 i 0.59 w 4 M 1 j 0 J []0 d 1 0 0 1 9 5.0908 cm 0 0 m -0.142 0 -0.28 0.008 -0.418 0.015 c -2.199 -1.969 -5.555 -2.242 -4.642 -1.42 c -4.024 -0.862 -3.916 0.111 -3.954 0.916 c -5.658 1.795 -6.772 3.222 -6.772 4.839 c -6.772 7.509 -3.74 9.674 0 9.674 c 3.74 9.674 6.772 7.509 6.772 4.839 c 6.772 2.167 3.74 0 0 0 c 7.74 12.616 m -7.74 12.616 l -8.274 12.616 -8.707 12.184 -8.707 11.649 c -8.707 -3.831 l -8.707 -4.365 -8.274 -4.798 -7.74 -4.798 c 7.74 -4.798 l 8.274 -4.798 8.707 -4.365 8.707 -3.831 c 8.707 11.649 l 8.707 12.184 8.274 12.616 7.74 12.616 c b
@@ -144,31 +151,80 @@ endstream @@ -144,31 +151,80 @@ endstream
144 endobj 151 endobj
145 152
146 %QDF: ignore_newline 153 %QDF: ignore_newline
147 -13 0 obj 154 +14 0 obj
148 928 155 928
149 endobj 156 endobj
150 157
  158 +15 0 obj
  159 +<<
  160 + /F 28
  161 + /Open false
  162 + /Parent 16 0 R
  163 + /Rect [
  164 + 612
  165 + 601
  166 + 792
  167 + 721
  168 + ]
  169 + /Subtype /Popup
  170 + /Type /Annot
  171 +>>
  172 +endobj
  173 +
  174 +16 0 obj
  175 +<<
  176 + /AP <<
  177 + /N 13 0 R
  178 + >>
  179 + /C [
  180 + 1
  181 + 1
  182 + 0
  183 + ]
  184 + /CA 1
  185 + /Contents (Salad)
  186 + /CreationDate (D:20181231235455Z00'00)
  187 + /F 28
  188 + /M (D:20181231235455Z00'00)
  189 + /Name /Comment
  190 + /P 3 0 R
  191 + /Popup 15 0 R
  192 + /Rect [
  193 + 235
  194 + 703
  195 + 253
  196 + 721
  197 + ]
  198 + /Subtype /Text
  199 + /T (Jay Berkenbilt)
  200 + /Type /Annot
  201 +>>
  202 +endobj
  203 +
151 xref 204 xref
152 -0 14 205 +0 17
153 0000000000 65535 f 206 0000000000 65535 f
154 0000000025 00000 n 207 0000000025 00000 n
155 0000000079 00000 n 208 0000000079 00000 n
156 0000000161 00000 n 209 0000000161 00000 n
157 -0000000450 00000 n  
158 -0000000507 00000 n  
159 -0000000548 00000 n  
160 -0000000647 00000 n  
161 -0000000689 00000 n  
162 -0000000779 00000 n  
163 -0000000798 00000 n  
164 -0000000917 00000 n  
165 -0000000953 00000 n  
166 -0000002197 00000 n 210 +0000000443 00000 n
  211 +0000000495 00000 n
  212 +0000000552 00000 n
  213 +0000000593 00000 n
  214 +0000000692 00000 n
  215 +0000000734 00000 n
  216 +0000000825 00000 n
  217 +0000000845 00000 n
  218 +0000000964 00000 n
  219 +0000001000 00000 n
  220 +0000002244 00000 n
  221 +0000002265 00000 n
  222 +0000002406 00000 n
167 trailer << 223 trailer <<
168 /Root 1 0 R 224 /Root 1 0 R
169 - /Size 14 225 + /Size 17
170 /ID [<c5b1999a07a3fdcd0c04cfeed299c25a><31415926535897932384626433832795>] 226 /ID [<c5b1999a07a3fdcd0c04cfeed299c25a><31415926535897932384626433832795>]
171 >> 227 >>
172 startxref 228 startxref
173 -2218 229 +2737
174 %%EOF 230 %%EOF
qpdf/qtest/qpdf/need-appearances-more-out.pdf
No preview for this file type
qpdf/qtest/qpdf/need-appearances-out.pdf
No preview for this file type