pdf-reader 1.1.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG +87 -2
- data/{README.rdoc → README.md} +43 -31
- data/Rakefile +21 -16
- data/bin/pdf_callbacks +1 -1
- data/bin/pdf_object +4 -1
- data/bin/pdf_text +1 -3
- data/examples/callbacks.rb +2 -1
- data/examples/extract_images.rb +11 -6
- data/examples/fuzzy_paragraphs.rb +24 -0
- data/lib/pdf/reader/afm/Courier-Bold.afm +342 -0
- data/lib/pdf/reader/afm/Courier-BoldOblique.afm +342 -0
- data/lib/pdf/reader/afm/Courier-Oblique.afm +342 -0
- data/lib/pdf/reader/afm/Courier.afm +342 -0
- data/lib/pdf/reader/afm/Helvetica-Bold.afm +2827 -0
- data/lib/pdf/reader/afm/Helvetica-BoldOblique.afm +2827 -0
- data/lib/pdf/reader/afm/Helvetica-Oblique.afm +3051 -0
- data/lib/pdf/reader/afm/Helvetica.afm +3051 -0
- data/lib/pdf/reader/afm/MustRead.html +19 -0
- data/lib/pdf/reader/afm/Symbol.afm +213 -0
- data/lib/pdf/reader/afm/Times-Bold.afm +2588 -0
- data/lib/pdf/reader/afm/Times-BoldItalic.afm +2384 -0
- data/lib/pdf/reader/afm/Times-Italic.afm +2667 -0
- data/lib/pdf/reader/afm/Times-Roman.afm +2419 -0
- data/lib/pdf/reader/afm/ZapfDingbats.afm +225 -0
- data/lib/pdf/reader/buffer.rb +90 -63
- data/lib/pdf/reader/cid_widths.rb +63 -0
- data/lib/pdf/reader/cmap.rb +69 -38
- data/lib/pdf/reader/encoding.rb +74 -48
- data/lib/pdf/reader/error.rb +24 -4
- data/lib/pdf/reader/filter/ascii85.rb +28 -0
- data/lib/pdf/reader/filter/ascii_hex.rb +30 -0
- data/lib/pdf/reader/filter/depredict.rb +141 -0
- data/lib/pdf/reader/filter/flate.rb +53 -0
- data/lib/pdf/reader/filter/lzw.rb +21 -0
- data/lib/pdf/reader/filter/null.rb +18 -0
- data/lib/pdf/reader/filter/run_length.rb +45 -0
- data/lib/pdf/reader/filter.rb +15 -234
- data/lib/pdf/reader/font.rb +107 -43
- data/lib/pdf/reader/font_descriptor.rb +80 -0
- data/lib/pdf/reader/form_xobject.rb +26 -4
- data/lib/pdf/reader/glyph_hash.rb +56 -18
- data/lib/pdf/reader/lzw.rb +6 -4
- data/lib/pdf/reader/null_security_handler.rb +17 -0
- data/lib/pdf/reader/object_cache.rb +40 -16
- data/lib/pdf/reader/object_hash.rb +94 -40
- data/lib/pdf/reader/object_stream.rb +1 -0
- data/lib/pdf/reader/orientation_detector.rb +34 -0
- data/lib/pdf/reader/overlapping_runs_filter.rb +65 -0
- data/lib/pdf/reader/page.rb +48 -3
- data/lib/pdf/reader/page_layout.rb +125 -0
- data/lib/pdf/reader/page_state.rb +185 -70
- data/lib/pdf/reader/page_text_receiver.rb +70 -20
- data/lib/pdf/reader/pages_strategy.rb +4 -293
- data/lib/pdf/reader/parser.rb +37 -61
- data/lib/pdf/reader/print_receiver.rb +6 -0
- data/lib/pdf/reader/reference.rb +4 -1
- data/lib/pdf/reader/register_receiver.rb +17 -31
- data/lib/pdf/reader/resource_methods.rb +1 -0
- data/lib/pdf/reader/standard_security_handler.rb +82 -42
- data/lib/pdf/reader/standard_security_handler_v5.rb +91 -0
- data/lib/pdf/reader/stream.rb +5 -2
- data/lib/pdf/reader/synchronized_cache.rb +33 -0
- data/lib/pdf/reader/text_run.rb +99 -0
- data/lib/pdf/reader/token.rb +4 -1
- data/lib/pdf/reader/transformation_matrix.rb +195 -0
- data/lib/pdf/reader/unimplemented_security_handler.rb +17 -0
- data/lib/pdf/reader/width_calculator/built_in.rb +67 -0
- data/lib/pdf/reader/width_calculator/composite.rb +28 -0
- data/lib/pdf/reader/width_calculator/true_type.rb +56 -0
- data/lib/pdf/reader/width_calculator/type_one_or_three.rb +33 -0
- data/lib/pdf/reader/width_calculator/type_zero.rb +25 -0
- data/lib/pdf/reader/width_calculator.rb +12 -0
- data/lib/pdf/reader/xref.rb +41 -9
- data/lib/pdf/reader.rb +45 -104
- data/lib/pdf-reader.rb +4 -1
- metadata +220 -101
- data/bin/pdf_list_callbacks +0 -17
- data/lib/pdf/hash.rb +0 -15
- data/lib/pdf/reader/abstract_strategy.rb +0 -81
- data/lib/pdf/reader/metadata_strategy.rb +0 -56
- data/lib/pdf/reader/text_receiver.rb +0 -264
@@ -0,0 +1,225 @@
|
|
1
|
+
StartFontMetrics 4.1
|
2
|
+
Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
|
3
|
+
Comment Creation Date: Thu May 1 15:14:13 1997
|
4
|
+
Comment UniqueID 43082
|
5
|
+
Comment VMusage 45775 55535
|
6
|
+
FontName ZapfDingbats
|
7
|
+
FullName ITC Zapf Dingbats
|
8
|
+
FamilyName ZapfDingbats
|
9
|
+
Weight Medium
|
10
|
+
ItalicAngle 0
|
11
|
+
IsFixedPitch false
|
12
|
+
CharacterSet Special
|
13
|
+
FontBBox -1 -143 981 820
|
14
|
+
UnderlinePosition -100
|
15
|
+
UnderlineThickness 50
|
16
|
+
Version 002.000
|
17
|
+
Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
|
18
|
+
EncodingScheme FontSpecific
|
19
|
+
StdHW 28
|
20
|
+
StdVW 90
|
21
|
+
StartCharMetrics 202
|
22
|
+
C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
|
23
|
+
C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
|
24
|
+
C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
|
25
|
+
C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
|
26
|
+
C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
|
27
|
+
C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
|
28
|
+
C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
|
29
|
+
C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
|
30
|
+
C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
|
31
|
+
C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;
|
32
|
+
C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
|
33
|
+
C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
|
34
|
+
C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
|
35
|
+
C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
|
36
|
+
C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
|
37
|
+
C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
|
38
|
+
C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
|
39
|
+
C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
|
40
|
+
C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
|
41
|
+
C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
|
42
|
+
C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
|
43
|
+
C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
|
44
|
+
C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
|
45
|
+
C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
|
46
|
+
C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
|
47
|
+
C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
|
48
|
+
C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
|
49
|
+
C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
|
50
|
+
C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
|
51
|
+
C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
|
52
|
+
C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
|
53
|
+
C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
|
54
|
+
C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
|
55
|
+
C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
|
56
|
+
C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
|
57
|
+
C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
|
58
|
+
C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
|
59
|
+
C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
|
60
|
+
C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
|
61
|
+
C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
|
62
|
+
C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
|
63
|
+
C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
|
64
|
+
C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
|
65
|
+
C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
|
66
|
+
C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
|
67
|
+
C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
|
68
|
+
C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
|
69
|
+
C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
|
70
|
+
C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
|
71
|
+
C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
|
72
|
+
C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
|
73
|
+
C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
|
74
|
+
C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
|
75
|
+
C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
|
76
|
+
C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
|
77
|
+
C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
|
78
|
+
C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
|
79
|
+
C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
|
80
|
+
C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
|
81
|
+
C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
|
82
|
+
C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
|
83
|
+
C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
|
84
|
+
C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
|
85
|
+
C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
|
86
|
+
C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
|
87
|
+
C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
|
88
|
+
C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
|
89
|
+
C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
|
90
|
+
C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
|
91
|
+
C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
|
92
|
+
C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
|
93
|
+
C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
|
94
|
+
C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
|
95
|
+
C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
|
96
|
+
C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
|
97
|
+
C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
|
98
|
+
C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
|
99
|
+
C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
|
100
|
+
C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
|
101
|
+
C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
|
102
|
+
C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
|
103
|
+
C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
|
104
|
+
C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
|
105
|
+
C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
|
106
|
+
C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
|
107
|
+
C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
|
108
|
+
C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
|
109
|
+
C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
|
110
|
+
C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
|
111
|
+
C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
|
112
|
+
C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
|
113
|
+
C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
|
114
|
+
C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
|
115
|
+
C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
|
116
|
+
C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
|
117
|
+
C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
|
118
|
+
C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
|
119
|
+
C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;
|
120
|
+
C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;
|
121
|
+
C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;
|
122
|
+
C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;
|
123
|
+
C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;
|
124
|
+
C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;
|
125
|
+
C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;
|
126
|
+
C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;
|
127
|
+
C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
|
128
|
+
C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
|
129
|
+
C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;
|
130
|
+
C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;
|
131
|
+
C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
|
132
|
+
C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
|
133
|
+
C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
|
134
|
+
C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
|
135
|
+
C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
|
136
|
+
C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
|
137
|
+
C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
|
138
|
+
C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
|
139
|
+
C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
|
140
|
+
C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
|
141
|
+
C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
|
142
|
+
C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
|
143
|
+
C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
|
144
|
+
C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
|
145
|
+
C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
|
146
|
+
C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
|
147
|
+
C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
|
148
|
+
C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
|
149
|
+
C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
|
150
|
+
C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
|
151
|
+
C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
|
152
|
+
C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
|
153
|
+
C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
|
154
|
+
C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
|
155
|
+
C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
|
156
|
+
C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
|
157
|
+
C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
|
158
|
+
C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
|
159
|
+
C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
|
160
|
+
C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
|
161
|
+
C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
|
162
|
+
C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
|
163
|
+
C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
|
164
|
+
C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
|
165
|
+
C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
|
166
|
+
C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
|
167
|
+
C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
|
168
|
+
C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
|
169
|
+
C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
|
170
|
+
C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
|
171
|
+
C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
|
172
|
+
C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
|
173
|
+
C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
|
174
|
+
C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
|
175
|
+
C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
|
176
|
+
C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
|
177
|
+
C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
|
178
|
+
C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
|
179
|
+
C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
|
180
|
+
C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
|
181
|
+
C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
|
182
|
+
C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
|
183
|
+
C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
|
184
|
+
C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
|
185
|
+
C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
|
186
|
+
C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
|
187
|
+
C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
|
188
|
+
C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
|
189
|
+
C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
|
190
|
+
C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
|
191
|
+
C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
|
192
|
+
C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
|
193
|
+
C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
|
194
|
+
C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
|
195
|
+
C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
|
196
|
+
C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
|
197
|
+
C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
|
198
|
+
C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
|
199
|
+
C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
|
200
|
+
C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
|
201
|
+
C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
|
202
|
+
C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
|
203
|
+
C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
|
204
|
+
C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
|
205
|
+
C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
|
206
|
+
C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
|
207
|
+
C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
|
208
|
+
C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
|
209
|
+
C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
|
210
|
+
C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
|
211
|
+
C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
|
212
|
+
C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
|
213
|
+
C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
|
214
|
+
C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
|
215
|
+
C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
|
216
|
+
C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
|
217
|
+
C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
|
218
|
+
C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
|
219
|
+
C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
|
220
|
+
C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
|
221
|
+
C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
|
222
|
+
C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
|
223
|
+
C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
|
224
|
+
EndCharMetrics
|
225
|
+
EndFontMetrics
|
data/lib/pdf/reader/buffer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# coding:
|
1
|
+
# coding: ASCII-8BIT
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
################################################################################
|
4
5
|
#
|
@@ -36,7 +37,17 @@ class PDF::Reader
|
|
36
37
|
# the raw tokens into objects we can work with (strings, ints, arrays, etc)
|
37
38
|
#
|
38
39
|
class Buffer
|
39
|
-
TOKEN_WHITESPACE=[
|
40
|
+
TOKEN_WHITESPACE=[0x00, 0x09, 0x0A, 0x0C, 0x0D, 0x20]
|
41
|
+
TOKEN_DELIMITER=[0x25, 0x3C, 0x3E, 0x28, 0x5B, 0x7B, 0x29, 0x5D, 0x7D, 0x2F]
|
42
|
+
|
43
|
+
# some strings for comparissons. Declaring them here avoids creating new
|
44
|
+
# strings that need GC over and over
|
45
|
+
LEFT_PAREN = "("
|
46
|
+
LESS_THAN = "<"
|
47
|
+
STREAM = "stream"
|
48
|
+
ID = "ID"
|
49
|
+
FWD_SLASH = "/"
|
50
|
+
NULL_BYTE = "\x00"
|
40
51
|
|
41
52
|
attr_reader :pos
|
42
53
|
|
@@ -44,7 +55,7 @@ class PDF::Reader
|
|
44
55
|
#
|
45
56
|
# Params:
|
46
57
|
#
|
47
|
-
# io - an IO stream
|
58
|
+
# io - an IO stream (usually a StringIO) with the raw data to tokenise
|
48
59
|
#
|
49
60
|
# options:
|
50
61
|
#
|
@@ -52,7 +63,7 @@ class PDF::Reader
|
|
52
63
|
# :content_stream - set to true if buffer will be tokenising a
|
53
64
|
# content stream. Defaults to false
|
54
65
|
#
|
55
|
-
def initialize
|
66
|
+
def initialize(io, opts = {})
|
56
67
|
@io = io
|
57
68
|
@tokens = []
|
58
69
|
@in_content_stream = opts[:content_stream]
|
@@ -115,12 +126,13 @@ class PDF::Reader
|
|
115
126
|
# return the byte offset where the first XRef table in th source can be found.
|
116
127
|
#
|
117
128
|
def find_first_xref_offset
|
129
|
+
check_size_is_non_zero
|
118
130
|
@io.seek(-1024, IO::SEEK_END) rescue @io.seek(0)
|
119
131
|
data = @io.read(1024)
|
120
132
|
|
121
133
|
# the PDF 1.7 spec (section #3.4) says that EOL markers can be either \r, \n, or both.
|
122
134
|
lines = data.split(/[\n\r]+/).reverse
|
123
|
-
eof_index = lines.index { |l| l.strip
|
135
|
+
eof_index = lines.index { |l| l.strip[/^%%EOF/] }
|
124
136
|
|
125
137
|
raise MalformedPDFError, "PDF does not contain EOF marker" if eof_index.nil?
|
126
138
|
raise MalformedPDFError, "PDF EOF marker does not follow offset" if eof_index >= lines.size-1
|
@@ -129,6 +141,13 @@ class PDF::Reader
|
|
129
141
|
|
130
142
|
private
|
131
143
|
|
144
|
+
def check_size_is_non_zero
|
145
|
+
@io.seek(-1, IO::SEEK_END)
|
146
|
+
@io.seek(0)
|
147
|
+
rescue Errno::EINVAL
|
148
|
+
raise MalformedPDFError, "PDF file is empty"
|
149
|
+
end
|
150
|
+
|
132
151
|
# Returns true if this buffer is parsing a content stream
|
133
152
|
#
|
134
153
|
def in_content_stream?
|
@@ -168,11 +187,11 @@ class PDF::Reader
|
|
168
187
|
#
|
169
188
|
def state
|
170
189
|
case @tokens.last
|
171
|
-
when
|
172
|
-
when
|
173
|
-
when
|
174
|
-
when
|
175
|
-
if in_content_stream? && @tokens[-2] !=
|
190
|
+
when LEFT_PAREN then :literal_string
|
191
|
+
when LESS_THAN then :hex_string
|
192
|
+
when STREAM then :stream
|
193
|
+
when ID
|
194
|
+
if in_content_stream? && @tokens[-2] != FWD_SLASH
|
176
195
|
:inline
|
177
196
|
else
|
178
197
|
:regular
|
@@ -207,11 +226,11 @@ class PDF::Reader
|
|
207
226
|
end
|
208
227
|
|
209
228
|
def prepare_inline_token
|
210
|
-
str = ""
|
229
|
+
str = "".dup
|
211
230
|
|
212
231
|
buffer = []
|
213
232
|
|
214
|
-
until buffer[0] =~ /\s/ && buffer[1, 2] == ["E", "I"]
|
233
|
+
until buffer[0] =~ /\s|\0/ && buffer[1, 2] == ["E", "I"]
|
215
234
|
chr = @io.read(1)
|
216
235
|
buffer << chr
|
217
236
|
|
@@ -220,7 +239,9 @@ class PDF::Reader
|
|
220
239
|
end
|
221
240
|
end
|
222
241
|
|
223
|
-
|
242
|
+
str << NULL_BYTE if buffer.first == NULL_BYTE
|
243
|
+
|
244
|
+
@tokens << string_token(str)
|
224
245
|
@io.seek(-3, IO::SEEK_CUR) unless chr.nil?
|
225
246
|
end
|
226
247
|
|
@@ -228,22 +249,21 @@ class PDF::Reader
|
|
228
249
|
# we find a closing >
|
229
250
|
#
|
230
251
|
def prepare_hex_token
|
231
|
-
str = ""
|
252
|
+
str = "".dup
|
232
253
|
finished = false
|
233
254
|
|
234
255
|
while !finished
|
235
|
-
|
236
|
-
|
237
|
-
if chr.nil?
|
256
|
+
byte = @io.getbyte
|
257
|
+
if byte.nil?
|
238
258
|
finished = true # unbalanced params
|
239
|
-
elsif (48..57).include?(
|
240
|
-
str <<
|
241
|
-
elsif
|
259
|
+
elsif (48..57).include?(byte) || (65..90).include?(byte) || (97..122).include?(byte)
|
260
|
+
str << byte
|
261
|
+
elsif byte <= 32
|
242
262
|
# ignore it
|
243
263
|
else
|
244
264
|
@tokens << str if str.size > 0
|
245
|
-
@tokens << ">" if
|
246
|
-
@tokens << chr
|
265
|
+
@tokens << ">" if byte != 0x3E # '>'
|
266
|
+
@tokens << byte.chr
|
247
267
|
finished = true
|
248
268
|
end
|
249
269
|
end
|
@@ -259,23 +279,23 @@ class PDF::Reader
|
|
259
279
|
# problem.
|
260
280
|
#
|
261
281
|
def prepare_literal_token
|
262
|
-
str = ""
|
282
|
+
str = "".dup
|
263
283
|
count = 1
|
264
284
|
|
265
285
|
while count > 0
|
266
|
-
|
267
|
-
if
|
286
|
+
byte = @io.getbyte
|
287
|
+
if byte.nil?
|
268
288
|
count = 0 # unbalanced params
|
269
|
-
elsif
|
270
|
-
str <<
|
271
|
-
elsif
|
289
|
+
elsif byte == 0x5C
|
290
|
+
str << byte << @io.getbyte
|
291
|
+
elsif byte == 0x28 # "("
|
272
292
|
str << "("
|
273
293
|
count += 1
|
274
|
-
elsif
|
294
|
+
elsif byte == 0x29 # ")"
|
275
295
|
count -= 1
|
276
296
|
str << ")" unless count == 0
|
277
297
|
else
|
278
|
-
str <<
|
298
|
+
str << byte unless count == 0
|
279
299
|
end
|
280
300
|
end
|
281
301
|
|
@@ -289,63 +309,70 @@ class PDF::Reader
|
|
289
309
|
# to read up on it.
|
290
310
|
#
|
291
311
|
def prepare_regular_token
|
292
|
-
tok = ""
|
312
|
+
tok = "".dup
|
293
313
|
|
294
|
-
while
|
295
|
-
case
|
296
|
-
when
|
314
|
+
while byte = @io.getbyte
|
315
|
+
case byte
|
316
|
+
when 0x25
|
297
317
|
# comment, ignore everything until the next EOL char
|
298
318
|
done = false
|
299
319
|
while !done
|
300
|
-
|
301
|
-
done = true if
|
320
|
+
byte = @io.getbyte
|
321
|
+
done = true if byte.nil? || byte == 0x0A || byte == 0x0D
|
302
322
|
end
|
303
323
|
when *TOKEN_WHITESPACE
|
304
324
|
# white space, token finished
|
305
325
|
@tokens << tok if tok.size > 0
|
306
326
|
|
307
327
|
#If the token was empty, chomp the rest of the whitespace too
|
308
|
-
while TOKEN_WHITESPACE.include?(
|
309
|
-
@io.
|
328
|
+
while TOKEN_WHITESPACE.include?(peek_byte) && tok.size == 0
|
329
|
+
@io.getbyte
|
310
330
|
end
|
311
|
-
tok = ""
|
331
|
+
tok = "".dup
|
312
332
|
break
|
313
|
-
when
|
333
|
+
when 0x3C
|
314
334
|
# opening delimiter '<', start of new token
|
315
335
|
@tokens << tok if tok.size > 0
|
316
|
-
|
317
|
-
|
318
|
-
|
336
|
+
if peek_byte == 0x3C # check if token is actually '<<'
|
337
|
+
@io.getbyte
|
338
|
+
@tokens << "<<"
|
339
|
+
else
|
340
|
+
@tokens << "<"
|
341
|
+
end
|
342
|
+
tok = "".dup
|
319
343
|
break
|
320
|
-
when
|
344
|
+
when 0x3E
|
321
345
|
# closing delimiter '>', start of new token
|
322
346
|
@tokens << tok if tok.size > 0
|
323
|
-
|
324
|
-
|
325
|
-
|
347
|
+
if peek_byte == 0x3E # check if token is actually '>>'
|
348
|
+
@io.getbyte
|
349
|
+
@tokens << ">>"
|
350
|
+
else
|
351
|
+
@tokens << ">"
|
352
|
+
end
|
353
|
+
tok = "".dup
|
326
354
|
break
|
327
|
-
when
|
355
|
+
when 0x28, 0x5B, 0x7B
|
328
356
|
# opening delimiter, start of new token
|
329
357
|
@tokens << tok if tok.size > 0
|
330
|
-
@tokens << chr
|
331
|
-
tok = ""
|
358
|
+
@tokens << byte.chr
|
359
|
+
tok = "".dup
|
332
360
|
break
|
333
|
-
when
|
361
|
+
when 0x29, 0x5D, 0x7D
|
334
362
|
# closing delimiter
|
335
363
|
@tokens << tok if tok.size > 0
|
336
|
-
@tokens << chr
|
337
|
-
tok = ""
|
364
|
+
@tokens << byte.chr
|
365
|
+
tok = "".dup
|
338
366
|
break
|
339
|
-
when
|
367
|
+
when 0x2F
|
340
368
|
# PDF name, start of new token
|
341
369
|
@tokens << tok if tok.size > 0
|
342
|
-
@tokens << chr
|
343
|
-
|
344
|
-
|
345
|
-
tok = ""
|
370
|
+
@tokens << byte.chr
|
371
|
+
@tokens << "" if byte == 0x2F && ([nil, 0x20, 0x0A] + TOKEN_DELIMITER).include?(peek_byte)
|
372
|
+
tok = "".dup
|
346
373
|
break
|
347
374
|
else
|
348
|
-
tok <<
|
375
|
+
tok << byte
|
349
376
|
end
|
350
377
|
end
|
351
378
|
|
@@ -355,10 +382,10 @@ class PDF::Reader
|
|
355
382
|
# peek at the next character in the io stream, leaving the stream position
|
356
383
|
# untouched
|
357
384
|
#
|
358
|
-
def
|
359
|
-
|
360
|
-
@io.seek(-1, IO::SEEK_CUR)
|
361
|
-
|
385
|
+
def peek_byte
|
386
|
+
byte = @io.getbyte
|
387
|
+
@io.seek(-1, IO::SEEK_CUR) if byte
|
388
|
+
byte
|
362
389
|
end
|
363
390
|
|
364
391
|
# for a handful of tokens we want to tell the parser how to convert them
|