rpdf2txt 0.8.2
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.
- data/History.txt +5 -0
- data/LICENCE +515 -0
- data/Manifest.txt +126 -0
- data/README.txt +30 -0
- data/Rakefile +24 -0
- data/bin/rpdf2txt +58 -0
- data/config.save +12 -0
- data/install.rb +1098 -0
- data/lib/rpdf2txt-rockit/base_extensions.rb +73 -0
- data/lib/rpdf2txt-rockit/bootstrap.rb +120 -0
- data/lib/rpdf2txt-rockit/bounded_lru_cache.rb +43 -0
- data/lib/rpdf2txt-rockit/conflict_resolution.rb +302 -0
- data/lib/rpdf2txt-rockit/directed_graph.rb +401 -0
- data/lib/rpdf2txt-rockit/glr_parser.rb +393 -0
- data/lib/rpdf2txt-rockit/grammar.rb +644 -0
- data/lib/rpdf2txt-rockit/graphdrawing.rb +107 -0
- data/lib/rpdf2txt-rockit/graphviz_dot.rb +63 -0
- data/lib/rpdf2txt-rockit/indexable.rb +53 -0
- data/lib/rpdf2txt-rockit/lalr_parsetable_generator.rb +144 -0
- data/lib/rpdf2txt-rockit/parse_table.rb +273 -0
- data/lib/rpdf2txt-rockit/parsetable_generation.rb +164 -0
- data/lib/rpdf2txt-rockit/parsing_ambiguities.rb +84 -0
- data/lib/rpdf2txt-rockit/profiler.rb +168 -0
- data/lib/rpdf2txt-rockit/reduce_actions_generator.rb +523 -0
- data/lib/rpdf2txt-rockit/rockit.rb +76 -0
- data/lib/rpdf2txt-rockit/rockit_grammar_ast_eval.rb +187 -0
- data/lib/rpdf2txt-rockit/rockit_grammars_parser.rb +126 -0
- data/lib/rpdf2txt-rockit/sourcecode_dumpable.rb +181 -0
- data/lib/rpdf2txt-rockit/stringscanner.rb +54 -0
- data/lib/rpdf2txt-rockit/syntax_tree.rb +452 -0
- data/lib/rpdf2txt-rockit/token.rb +364 -0
- data/lib/rpdf2txt-rockit/version.rb +3 -0
- data/lib/rpdf2txt/attributesparser.rb +42 -0
- data/lib/rpdf2txt/cmapparser.rb +65 -0
- data/lib/rpdf2txt/data/_cmap.grammar +11 -0
- data/lib/rpdf2txt/data/_cmap_range.grammar +15 -0
- data/lib/rpdf2txt/data/_pdfattributes.grammar +32 -0
- data/lib/rpdf2txt/data/cmap.grammar +11 -0
- data/lib/rpdf2txt/data/cmap.rb +37 -0
- data/lib/rpdf2txt/data/cmap_range.grammar +15 -0
- data/lib/rpdf2txt/data/cmap_range.rb +43 -0
- data/lib/rpdf2txt/data/fonts/Courier-Bold.afm +342 -0
- data/lib/rpdf2txt/data/fonts/Courier-BoldOblique.afm +342 -0
- data/lib/rpdf2txt/data/fonts/Courier-Oblique.afm +342 -0
- data/lib/rpdf2txt/data/fonts/Courier.afm +342 -0
- data/lib/rpdf2txt/data/fonts/Helvetica-Bold.afm +2827 -0
- data/lib/rpdf2txt/data/fonts/Helvetica-BoldOblique.afm +2827 -0
- data/lib/rpdf2txt/data/fonts/Helvetica-Oblique.afm +3051 -0
- data/lib/rpdf2txt/data/fonts/Helvetica.afm +3051 -0
- data/lib/rpdf2txt/data/fonts/License-Adobe.txt +65 -0
- data/lib/rpdf2txt/data/fonts/Symbol.afm +213 -0
- data/lib/rpdf2txt/data/fonts/Times-Bold.afm +2588 -0
- data/lib/rpdf2txt/data/fonts/Times-BoldItalic.afm +2384 -0
- data/lib/rpdf2txt/data/fonts/Times-Italic.afm +2667 -0
- data/lib/rpdf2txt/data/fonts/Times-Roman.afm +2419 -0
- data/lib/rpdf2txt/data/fonts/ZapfDingbats.afm +225 -0
- data/lib/rpdf2txt/data/pdfattributes.grammar +32 -0
- data/lib/rpdf2txt/data/pdfattributes.rb +71 -0
- data/lib/rpdf2txt/data/pdftext.grammar +102 -0
- data/lib/rpdf2txt/data/pdftext.rb +146 -0
- data/lib/rpdf2txt/default_handler.rb +352 -0
- data/lib/rpdf2txt/lzw.rb +69 -0
- data/lib/rpdf2txt/object.rb +1114 -0
- data/lib/rpdf2txt/parser.rb +169 -0
- data/lib/rpdf2txt/symbol.rb +408 -0
- data/lib/rpdf2txt/text.rb +182 -0
- data/lib/rpdf2txt/text_state.rb +434 -0
- data/lib/rpdf2txt/textparser.rb +42 -0
- data/test/data/3392_obj +0 -0
- data/test/data/397_decrypted +15 -0
- data/test/data/450_decrypted +153 -0
- data/test/data/450_obj +0 -0
- data/test/data/452_decrypted +125 -0
- data/test/data/454_decrypted +108 -0
- data/test/data/456_decrypted +106 -0
- data/test/data/458_decrypted +111 -0
- data/test/data/458_obj +0 -0
- data/test/data/460_decrypted +118 -0
- data/test/data/460_obj +0 -0
- data/test/data/463_decrypted +117 -0
- data/test/data/465_decrypted +107 -0
- data/test/data/465_obj +0 -0
- data/test/data/90_obj +0 -0
- data/test/data/90_obj_comp +1 -0
- data/test/data/decrypted +0 -0
- data/test/data/encrypt_obj +0 -0
- data/test/data/encrypt_string +0 -0
- data/test/data/encrypt_string_128bit +0 -0
- data/test/data/encrypted_object_stream.pdf +0 -0
- data/test/data/firststream +1 -0
- data/test/data/index.pdfobj +0 -0
- data/test/data/index_2bit.pdfobj +0 -0
- data/test/data/index_masked.pdfobj +0 -0
- data/test/data/indexed.pdfobj +0 -0
- data/test/data/indexed_2bit.pdfobj +0 -0
- data/test/data/indexed_masked.pdfobj +0 -0
- data/test/data/inline.png +0 -0
- data/test/data/logo.png +0 -0
- data/test/data/lzw.pdfobj +0 -0
- data/test/data/lzw_index.pdfobj +0 -0
- data/test/data/page_tree.pdf +148 -0
- data/test/data/pdf_20.png +0 -0
- data/test/data/pdf_21.png +0 -0
- data/test/data/pdf_22.png +0 -0
- data/test/data/pdf_50.png +0 -0
- data/test/data/png.pdfobj +0 -0
- data/test/data/space_bug_stream.txt +119 -0
- data/test/data/stream.txt +292 -0
- data/test/data/stream_kerning_bug.txt +13 -0
- data/test/data/stream_kerning_bug2.txt +6 -0
- data/test/data/test.pdf +0 -0
- data/test/data/test.txt +8 -0
- data/test/data/test_text.txt +42 -0
- data/test/data/working_obj +0 -0
- data/test/data/working_obj2 +0 -0
- data/test/mock.rb +149 -0
- data/test/suite.rb +30 -0
- data/test/test_pdf_object.rb +1802 -0
- data/test/test_pdf_parser.rb +1340 -0
- data/test/test_pdf_text.rb +789 -0
- data/test/test_space_bug_05_2004.rb +87 -0
- data/test/test_stream.rb +194 -0
- data/test/test_text_state.rb +315 -0
- data/usage-en.txt +112 -0
- data/user-stories/UserStories_Rpdf2Txt.txt +34 -0
- data/user-stories/documents/swissmedicjournal/04_2004.pdf +0 -0
- metadata +220 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
BT
|
|
2
|
+
0 8.003 -7.9999 0 348.36 176.4505 Tm
|
|
3
|
+
-0.0014 Tc
|
|
4
|
+
-16.6438 0 TD
|
|
5
|
+
0.0009 Tw
|
|
6
|
+
67.3249 0 TD
|
|
7
|
+
-0.001 Tc
|
|
8
|
+
0 Tw
|
|
9
|
+
-45.0132 0 TD
|
|
10
|
+
-0.0106 Tc
|
|
11
|
+
0.0177 Tw
|
|
12
|
+
[(RA)-18.4(TI)-17.7(OP)-18.4(HA)-18.4(RM)-9.8( GM)-17.3(BH)-28385.1(2)-9.2(0)-1343.7(S)-10.9(t)]TJ
|
|
13
|
+
ET
|
data/test/data/test.pdf
ADDED
|
Binary file
|
data/test/data/test.txt
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
q Q q 18 40 576 734 re W n /Cs1 cs 0 0 0 sc q 1 0 0 -1 18 774 cm BT
|
|
2
|
+
10 0 0 -10 510 12 Tm /F1.0 1 Tf (Page 1 of 1) Tj ET Q q 1 0 0 -1 18
|
|
3
|
+
774 cm BT 10 0 0 -10 0 12 Tm /F1.0 1 Tf (untitled text) Tj ET Q q 1
|
|
4
|
+
0 0 -1 18 774 cm BT 10 0 0 -10 0 24 Tm /F1.0 1 Tf (Printed: Donnerstag, 14. November 2002 14:04:29 Uhr)
|
|
5
|
+
Tj ET Q 0.25 w /Cs1 CS 0 0 0 SC q 1 0 0 -1 18 774 cm 0 36.125 m 576.25
|
|
6
|
+
36.125 l S Q q 1 0 0 -1 18 774 cm 0 34.125 m 576.25 34.125 l S Q Q
|
|
7
|
+
q 18 40 576 694 re W n /Cs1 cs 0 0 0 sc q 1 0 0 -1 18 774 cm BT 10
|
|
8
|
+
0 0 -10 1 52 Tm /F2.0 1 Tf (testpdf) Tj ET Q Q
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
BT
|
|
2
|
+
10 0 0 10 42.7953 670.6528 Tm
|
|
3
|
+
-0.0002 Tc
|
|
4
|
+
0 Tw
|
|
5
|
+
[(Zul.-Nr)91.8(.: )]TJ
|
|
6
|
+
/F8 1 Tf
|
|
7
|
+
3.8772 0 TD
|
|
8
|
+
-0.0001 Tc
|
|
9
|
+
(55921)Tj
|
|
10
|
+
/F3 1 Tf
|
|
11
|
+
8.8787 0 TD
|
|
12
|
+
(Abgabekategorie: )Tj
|
|
13
|
+
/F8 1 Tf
|
|
14
|
+
8.6923 0 TD
|
|
15
|
+
0 Tc
|
|
16
|
+
(D)Tj
|
|
17
|
+
/F3 1 Tf
|
|
18
|
+
4.0636 0 TD
|
|
19
|
+
-0.0001 Tc
|
|
20
|
+
-0.0305 Tw
|
|
21
|
+
[(Index: 02.98.0.)-9563.3(18.10.2002)]TJ
|
|
22
|
+
-25.5118 -2.2428 TD
|
|
23
|
+
0 Tw
|
|
24
|
+
[(Zusammensetzung:)-921(01)]TJ
|
|
25
|
+
8.3 0 0 8.3 156.1811 648.2247 Tm
|
|
26
|
+
0.1715 Tw
|
|
27
|
+
[(CRA)73.6(T)54.8(AEGI FOLII cum FLORE EXTRACTUM ETHANOLICUM SICCUM 450)-278.1(mg, EXCIPIENS pro)]TJ
|
|
28
|
+
0 -1.3661 TD
|
|
29
|
+
-0.0306 Tw
|
|
30
|
+
(COMPRESSO OBDUCTO.)Tj
|
|
31
|
+
10 0 0 10 42.7953 622.7121 Tm
|
|
32
|
+
-0.0304 Tw
|
|
33
|
+
[(Anwendung:)-5285.1(Bei nerv�sen Herzbeschwerden)]TJ
|
|
34
|
+
0 -1.4174 TD
|
|
35
|
+
0 Tw
|
|
36
|
+
[(Packungen:)-4532.5(01)-305.3(002)-7141.5(50)-566.7(Filmtabletten)-12429.9(D)]TJ
|
|
37
|
+
11.3386 -1.4174 TD
|
|
38
|
+
[(042)-6585.6(100)-566.7(Filmtabletten)-12429.9(D)]TJ
|
|
39
|
+
-11.3386 -1.4174 TD
|
|
40
|
+
-0.0304 Tw
|
|
41
|
+
[(G�ltig bis:)-6647.6(17. Oktober 2007)]TJ
|
|
42
|
+
ET
|
|
Binary file
|
|
Binary file
|
data/test/mock.rb
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Ruby/Mock version 1.0
|
|
2
|
+
#
|
|
3
|
+
# A class for conveniently building mock objects in RUnit test cases.
|
|
4
|
+
# Copyright (c) 2001 Nat Pryce, all rights reserved
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
|
8
|
+
# the Free Software Foundation; either version 2 of the License.
|
|
9
|
+
#
|
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU General Public License
|
|
16
|
+
# along with this program; if not, write to the Free Software
|
|
17
|
+
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
18
|
+
|
|
19
|
+
require 'runit/error'
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Mock
|
|
23
|
+
# Creates a new, named mock object. The name is reported in exceptions
|
|
24
|
+
# thrown by the mock object when method invocations are incorrect.
|
|
25
|
+
#
|
|
26
|
+
def initialize( mock_name = self.to_s )
|
|
27
|
+
@mock_calls = []
|
|
28
|
+
@next_call = 0
|
|
29
|
+
@name = mock_name
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Mock the next method call to be made to this mock object.
|
|
33
|
+
#
|
|
34
|
+
# A mock method is defined by the method name (a symbol) and a block
|
|
35
|
+
# that defines the arity of the method and the mocked behaviour for
|
|
36
|
+
# this call. The mocked behaviour should assert preconditions and
|
|
37
|
+
# return a value. Mocked behaviour should rarely be any more complex
|
|
38
|
+
# than that. If it is, that's probably an indication that the tests
|
|
39
|
+
# need some restructuring or that the tested code needs refactoring.
|
|
40
|
+
#
|
|
41
|
+
# If no block is given and preconditions have been defined for the named
|
|
42
|
+
# method, a block is created for the mocked methodthat has the same arity
|
|
43
|
+
# as the precondition and returns self.
|
|
44
|
+
#
|
|
45
|
+
def __next( name, &test )
|
|
46
|
+
if test == nil
|
|
47
|
+
if respond_to?( Mock.__pre(name) )
|
|
48
|
+
test = proc { |*args| self }
|
|
49
|
+
else
|
|
50
|
+
raise "no block given for mocked method #{name}"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
@mock_calls.push( [name,test] )
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Call this at the end of a test to ensure that all scheduled calls
|
|
57
|
+
# have been made to the mock
|
|
58
|
+
#
|
|
59
|
+
def __verify
|
|
60
|
+
if @next_call != @mock_calls.length
|
|
61
|
+
raise RUNIT::AssertionFailedError,
|
|
62
|
+
"not all expected method calls were made to #{@name}",
|
|
63
|
+
caller
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
# Dispatches aribtrary method calls to the next mocked behaviour
|
|
70
|
+
#
|
|
71
|
+
def method_missing( name, *args )
|
|
72
|
+
__mock_call( name, args, (block_given? ? proc : nil) )
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Implements a method call using the next mocked behaviour and asserts
|
|
76
|
+
# that the expected method is called with the expected number of
|
|
77
|
+
# arguments.
|
|
78
|
+
#
|
|
79
|
+
def __mock_call( name, args, block )
|
|
80
|
+
if @next_call >= @mock_calls.length
|
|
81
|
+
raise RUNIT::AssertionFailedError,
|
|
82
|
+
"unexpected call to #{name} method of #{@name}",
|
|
83
|
+
caller(2)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
expected_name,body = @mock_calls[@next_call]
|
|
87
|
+
@next_call += 1
|
|
88
|
+
|
|
89
|
+
if name != expected_name
|
|
90
|
+
raise RUNIT::AssertionFailedError,
|
|
91
|
+
"wrong method called on #{@name}; " +
|
|
92
|
+
"expected #{expected_name}, was #{name}",
|
|
93
|
+
caller(2)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
args_length = args.length + (block ? 1 : 0)
|
|
97
|
+
|
|
98
|
+
if body.arity < 0
|
|
99
|
+
if (body.arity+1).abs > args_length
|
|
100
|
+
raise RUNIT::AssertionFailedError,
|
|
101
|
+
"too few arguments to #{name} method of #{@name}; " +
|
|
102
|
+
"require #{(body.arity+1).abs}, got #{args.length}",
|
|
103
|
+
caller(2)
|
|
104
|
+
end
|
|
105
|
+
else
|
|
106
|
+
if body.arity != args_length
|
|
107
|
+
raise RUNIT::AssertionFailedError,
|
|
108
|
+
"wrong number of arguments to " +
|
|
109
|
+
"#{name} method of #{@name}; " +
|
|
110
|
+
"require #{body.arity}, got #{args.length}",
|
|
111
|
+
caller(2)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
if respond_to? Mock.__pre(name)
|
|
116
|
+
if block
|
|
117
|
+
precondition_ok = __send__( Mock.__pre(name), *args, &block )
|
|
118
|
+
else
|
|
119
|
+
precondition_ok = __send__( Mock.__pre(name), *args )
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
if not precondition_ok
|
|
123
|
+
raise RUNIT::AssertionFailedError,
|
|
124
|
+
"precondition of #{name} method violated",
|
|
125
|
+
caller(2)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
if block
|
|
130
|
+
instance_eval { body.call( block, *args ) }
|
|
131
|
+
else
|
|
132
|
+
instance_eval { body.call( *args ) }
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# The name of a precondition for a method
|
|
137
|
+
def Mock.__pre( method )
|
|
138
|
+
"__pre_#{method.to_i}".intern
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def Mock.method_added( name )
|
|
143
|
+
unless(/^__pre_/.match(name.to_s))
|
|
144
|
+
pre = self.__pre(name)
|
|
145
|
+
alias_method( pre, name )
|
|
146
|
+
undef_method(name)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
data/test/suite.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# Rpdf2txt -- PDF to Text Parser
|
|
4
|
+
# Copyright (C) 2003 Andreas Schrafl, Hannes Wyss
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
19
|
+
#
|
|
20
|
+
# ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Z�rich, Switzerland
|
|
21
|
+
# hwyss@ywesee.com, aschrafl@ywesee.com
|
|
22
|
+
#
|
|
23
|
+
# TestSuite -- Rpdf2txt -- 27.11.2002 -- aschrafl@ywesee.com
|
|
24
|
+
|
|
25
|
+
$: << File.dirname(File.expand_path(__FILE__))
|
|
26
|
+
$KCODE = 'u'
|
|
27
|
+
|
|
28
|
+
Dir.foreach(File.dirname(__FILE__)) { |file|
|
|
29
|
+
require file if /^test_.*\.rb$/o.match(file)
|
|
30
|
+
}
|
|
@@ -0,0 +1,1802 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# Rpdf2txt -- PDF to Text Parser
|
|
4
|
+
# Copyright (C) 2003 Andreas Schrafl, Hannes Wyss, Masaomi Hatakeyama
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
19
|
+
#
|
|
20
|
+
# ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Z�rich, Switzerland
|
|
21
|
+
# zdvatz@ywesee.com, mhatakeyama@ywesee.com
|
|
22
|
+
#
|
|
23
|
+
# TestPdfObject -- Rpdf2txt -- 21.11.2002 -- aschrafl@ywesee.com
|
|
24
|
+
|
|
25
|
+
$KCODE = 'u'
|
|
26
|
+
$: << File.expand_path('../lib', File.dirname(__FILE__))
|
|
27
|
+
|
|
28
|
+
require 'test/unit'
|
|
29
|
+
require 'tempfile'
|
|
30
|
+
require 'rpdf2txt/object'
|
|
31
|
+
require 'rpdf2txt/default_handler'
|
|
32
|
+
|
|
33
|
+
module Rpdf2txt
|
|
34
|
+
class PdfObject
|
|
35
|
+
attr_accessor :attributes
|
|
36
|
+
end
|
|
37
|
+
class TrailerDictionary
|
|
38
|
+
public
|
|
39
|
+
attr_accessor :attributes
|
|
40
|
+
end
|
|
41
|
+
class PageLeaf < TreeNode
|
|
42
|
+
attr_accessor :contents, :resources
|
|
43
|
+
public :join_snippets
|
|
44
|
+
end
|
|
45
|
+
class CMap < Stream
|
|
46
|
+
public :extract_bfchar, :extract_bfrange
|
|
47
|
+
end
|
|
48
|
+
class TestCmap < Test::Unit::TestCase
|
|
49
|
+
def setup
|
|
50
|
+
@input_bfchar = <<-EOS
|
|
51
|
+
25 0 obj
|
|
52
|
+
<</Length 357
|
|
53
|
+
>>
|
|
54
|
+
stream
|
|
55
|
+
/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo <<
|
|
56
|
+
/Registry (TT11+0) /Ordering (T42UV) /Supplement 0 >> def
|
|
57
|
+
/CMapName /TT11+0 def
|
|
58
|
+
/CMapType 2 def
|
|
59
|
+
1 begincodespacerange <004a> <0074> endcodespacerange
|
|
60
|
+
3 beginbfchar
|
|
61
|
+
<004a> <03B3>
|
|
62
|
+
<0064> <2264>
|
|
63
|
+
<0074> <2265>
|
|
64
|
+
endbfchar
|
|
65
|
+
endcmap CMapName currentdict /CMap defineresource pop end end
|
|
66
|
+
|
|
67
|
+
endstream
|
|
68
|
+
endobj
|
|
69
|
+
EOS
|
|
70
|
+
@input_bfrange = <<-EOS
|
|
71
|
+
75 0 obj
|
|
72
|
+
<</Length 338
|
|
73
|
+
>>
|
|
74
|
+
stream
|
|
75
|
+
/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo <<
|
|
76
|
+
/Registry (TT11+0) /Ordering (T42UV) /Supplement 0 >> def
|
|
77
|
+
/CMapName /TT11+0 def
|
|
78
|
+
/CMapType 2 def
|
|
79
|
+
1 begincodespacerange <0044> <0045> endcodespacerange
|
|
80
|
+
1 beginbfrange
|
|
81
|
+
<0044> <0045> <03B1>
|
|
82
|
+
endbfrange
|
|
83
|
+
endcmap CMapName currentdict /CMap defineresource pop end end
|
|
84
|
+
|
|
85
|
+
endstream
|
|
86
|
+
endobj
|
|
87
|
+
EOS
|
|
88
|
+
end
|
|
89
|
+
def test_parser_grammar_bfchar
|
|
90
|
+
cmap = Rpdf2txt::CMap.new(@input_bfchar)
|
|
91
|
+
assert_nothing_raised{
|
|
92
|
+
ast= Rpdf2txt.cmap_parser.parse(cmap.extract_bfchar)
|
|
93
|
+
}
|
|
94
|
+
end
|
|
95
|
+
def test_extract_attributes_bfchar
|
|
96
|
+
cmap = Rpdf2txt::CMap.new(@input_bfchar)
|
|
97
|
+
expected = {:length => "357"}
|
|
98
|
+
assert_equal(expected, cmap.attributes)
|
|
99
|
+
end
|
|
100
|
+
def test_cmap_bfchar
|
|
101
|
+
cmap = Rpdf2txt::CMap.new(@input_bfchar)
|
|
102
|
+
assert_equal(8805, cmap.map[116])
|
|
103
|
+
assert_equal(8804, cmap.map[100])
|
|
104
|
+
assert_equal(947, cmap.map[74])
|
|
105
|
+
end
|
|
106
|
+
def test_parser_grammar_bfrange
|
|
107
|
+
cmap = Rpdf2txt::CMap.new(@input_bfrange)
|
|
108
|
+
assert_nothing_raised{
|
|
109
|
+
ast= Rpdf2txt.cmap_range_parser.parse(cmap.extract_bfrange)
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
def test_cmap_bfrange
|
|
113
|
+
cmap = Rpdf2txt::CMap.new(@input_bfrange)
|
|
114
|
+
assert_equal(945, cmap.map[68])
|
|
115
|
+
assert_equal(946, cmap.map[69])
|
|
116
|
+
end
|
|
117
|
+
def test_cmap_bfrange_array
|
|
118
|
+
input_bfrange = <<-EOS
|
|
119
|
+
75 0 obj
|
|
120
|
+
<</Length 338
|
|
121
|
+
>>
|
|
122
|
+
stream
|
|
123
|
+
/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo <<
|
|
124
|
+
/Registry (TT11+0) /Ordering (T42UV) /Supplement 0 >> def
|
|
125
|
+
/CMapName /TT11+0 def
|
|
126
|
+
/CMapType 2 def
|
|
127
|
+
1 begincodespacerange <0094> <0095> endcodespacerange
|
|
128
|
+
1 beginbfrange
|
|
129
|
+
<0094> <0095> [ <2264> <2265> ] <0024> <0025> [ <2224> <2225> ]
|
|
130
|
+
endbfrange
|
|
131
|
+
endcmap CMapName currentdict /CMap defineresource pop end end
|
|
132
|
+
|
|
133
|
+
endstream
|
|
134
|
+
endobj
|
|
135
|
+
EOS
|
|
136
|
+
cmap = Rpdf2txt::CMap.new(input_bfrange)
|
|
137
|
+
assert_equal(8804, cmap.map[148])
|
|
138
|
+
assert_equal(8805, cmap.map[149])
|
|
139
|
+
assert_equal(8740, cmap.map[36])
|
|
140
|
+
assert_equal(8741, cmap.map[37])
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
class TestPdfObject < Test::Unit::TestCase
|
|
144
|
+
def setup
|
|
145
|
+
input = '3 0 obj << /Type /Page /Parent 2 0 R /Contents 6 0 R >> endobj'
|
|
146
|
+
@tree_node = Rpdf2txt::TreeNode.new(input)
|
|
147
|
+
end
|
|
148
|
+
def test_tree_node1
|
|
149
|
+
input = '4 0 obj << /Type /Pages /Kids [ 7 0 R 8 0 R ] /Count 2 >> endobj'
|
|
150
|
+
node = Rpdf2txt::TreeNode.new(input)
|
|
151
|
+
assert_equal(4, node.oid)
|
|
152
|
+
assert_equal(["7 0 R", "8 0 R"], node.attributes[:kids])
|
|
153
|
+
assert_equal(nil, node.attributes[:contents])
|
|
154
|
+
assert_equal(nil, node.attributes[:parent])
|
|
155
|
+
assert_equal(true, node.root?)
|
|
156
|
+
end
|
|
157
|
+
def test_tree_node2
|
|
158
|
+
input = '3 0 obj << /Type /Page /Parent 2 0 R /Contents 6 0 R >> endobj'
|
|
159
|
+
node = Rpdf2txt::TreeNode.new(input)
|
|
160
|
+
assert_equal(3, node.oid)
|
|
161
|
+
assert_equal(nil, node.attributes[:kids])
|
|
162
|
+
assert_equal('6 0 R', node.attributes[:contents])
|
|
163
|
+
assert_equal('2 0 R', node.attributes[:parent])
|
|
164
|
+
assert_equal(false, node.root?)
|
|
165
|
+
end
|
|
166
|
+
def test_tree_node3
|
|
167
|
+
input = '3 0 obj << /Type /Page /Parent 2 0 R / 2 0 R >> endobj'
|
|
168
|
+
node = nil
|
|
169
|
+
assert_nothing_raised {
|
|
170
|
+
node = Rpdf2txt::TreeNode.new(input)
|
|
171
|
+
}
|
|
172
|
+
end
|
|
173
|
+
def test_tree_node4
|
|
174
|
+
src = '
|
|
175
|
+
400 0 obj
|
|
176
|
+
<<
|
|
177
|
+
/Title (���\)����\\��P�T#/��-&��;S��O�A)
|
|
178
|
+
/Parent 399 0 R
|
|
179
|
+
/A 436 0 R
|
|
180
|
+
/Next 433 0 R
|
|
181
|
+
>>
|
|
182
|
+
endobj
|
|
183
|
+
'
|
|
184
|
+
node = Rpdf2txt::TreeNode.new(src)
|
|
185
|
+
assert_equal(400, node.oid)
|
|
186
|
+
assert_equal('433 0 R', node.attributes[:next])
|
|
187
|
+
end
|
|
188
|
+
def test_tree_node5
|
|
189
|
+
src = '
|
|
190
|
+
124 0 obj
|
|
191
|
+
<<
|
|
192
|
+
/Type /Font
|
|
193
|
+
/Subtype /CIDFontType2
|
|
194
|
+
/BaseFont /HAGNPN+SymbolMT
|
|
195
|
+
/FontDescriptor 122 0 R
|
|
196
|
+
/CIDSystemInfo << /Registry (y�>�)/Ordering (q�4�6ZB)/Supplement 0 >>
|
|
197
|
+
/DW 1000
|
|
198
|
+
/W [ 74 [ 411 ] 100 [ 548 ] 116 [ 548 ] ]
|
|
199
|
+
>>
|
|
200
|
+
endobj
|
|
201
|
+
'
|
|
202
|
+
node = Rpdf2txt::TreeNode.new(src)
|
|
203
|
+
assert_equal(124, node.oid)
|
|
204
|
+
end
|
|
205
|
+
def test_tree_node6
|
|
206
|
+
src = '
|
|
207
|
+
198 0 obj
|
|
208
|
+
<<
|
|
209
|
+
/S /Standard#20#28Web#29
|
|
210
|
+
/C /Standard#20#28Web#29
|
|
211
|
+
/Pg 11 0 R
|
|
212
|
+
/P 346 0 R
|
|
213
|
+
/K [ 13 << /Type /MCR /Pg 21 0 R /MCID 0 >> ]
|
|
214
|
+
>>
|
|
215
|
+
endobj
|
|
216
|
+
'
|
|
217
|
+
node = Rpdf2txt::TreeNode.new(src)
|
|
218
|
+
assert_equal(198, node.oid)
|
|
219
|
+
end
|
|
220
|
+
def test_tree_node7
|
|
221
|
+
src = '
|
|
222
|
+
345 0 obj
|
|
223
|
+
<<
|
|
224
|
+
/S /Standard
|
|
225
|
+
/C /Standard
|
|
226
|
+
/Pg 111 0 R
|
|
227
|
+
/K 17
|
|
228
|
+
/P 346 0 R
|
|
229
|
+
>>
|
|
230
|
+
endobj'
|
|
231
|
+
node = Rpdf2txt::TreeNode.new(src)
|
|
232
|
+
assert_equal(345, node.oid)
|
|
233
|
+
end
|
|
234
|
+
def test_tree_node8
|
|
235
|
+
src = '
|
|
236
|
+
346 0 obj
|
|
237
|
+
<<
|
|
238
|
+
/S /Sect
|
|
239
|
+
/P 396 0 R
|
|
240
|
+
/K [ 347 0 R 143 0 R 144 0 R 352 0 R 149 0 R 150 0 R 151 0 R 153 0 R 154 0 R
|
|
241
|
+
155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R
|
|
242
|
+
163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R
|
|
243
|
+
171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R
|
|
244
|
+
179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R
|
|
245
|
+
187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R
|
|
246
|
+
195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R
|
|
247
|
+
203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R
|
|
248
|
+
211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R
|
|
249
|
+
219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R
|
|
250
|
+
227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R
|
|
251
|
+
235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R
|
|
252
|
+
243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R
|
|
253
|
+
251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R
|
|
254
|
+
259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R
|
|
255
|
+
267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R
|
|
256
|
+
275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R
|
|
257
|
+
283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R
|
|
258
|
+
291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R
|
|
259
|
+
299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R
|
|
260
|
+
307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R
|
|
261
|
+
315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R
|
|
262
|
+
324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R
|
|
263
|
+
332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R
|
|
264
|
+
340 0 R 360 0 R 344 0 R 345 0 R ]
|
|
265
|
+
>>
|
|
266
|
+
endobj'
|
|
267
|
+
node = Rpdf2txt::TreeNode.new(src)
|
|
268
|
+
assert_equal(346, node.oid)
|
|
269
|
+
end
|
|
270
|
+
def test_tree_node9
|
|
271
|
+
src = '
|
|
272
|
+
346 0 obj
|
|
273
|
+
<<
|
|
274
|
+
/S /Sect
|
|
275
|
+
/P 396 0 R
|
|
276
|
+
/K [
|
|
277
|
+
155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R
|
|
278
|
+
155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R
|
|
279
|
+
163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R
|
|
280
|
+
163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R
|
|
281
|
+
190 ]
|
|
282
|
+
>>
|
|
283
|
+
endobj'
|
|
284
|
+
node = Rpdf2txt::TreeNode.new(src)
|
|
285
|
+
assert_equal(346, node.oid)
|
|
286
|
+
end
|
|
287
|
+
def test_tree_node10
|
|
288
|
+
src = '
|
|
289
|
+
198 0 obj
|
|
290
|
+
<<
|
|
291
|
+
/S /Standard#20#28Web#29
|
|
292
|
+
/C /Standard#20#28Web#29
|
|
293
|
+
/Pg 11 0 R
|
|
294
|
+
/P 346 0 R
|
|
295
|
+
/K [ ]
|
|
296
|
+
>>
|
|
297
|
+
endobj'
|
|
298
|
+
node = Rpdf2txt::TreeNode.new(src)
|
|
299
|
+
assert_equal(198, node.oid)
|
|
300
|
+
end
|
|
301
|
+
def test_extract_oids
|
|
302
|
+
input = '6 0 R'
|
|
303
|
+
assert_equal(@tree_node.extract_oids(input), [6])
|
|
304
|
+
input = ["7 0 R", "8 0 R"]
|
|
305
|
+
assert_equal(@tree_node.extract_oids(input), [7,8])
|
|
306
|
+
end
|
|
307
|
+
def test_parse_content_from_complex_attributes
|
|
308
|
+
src = <<-ENDOFSRC
|
|
309
|
+
46 0 obj
|
|
310
|
+
<<
|
|
311
|
+
/Type /Page
|
|
312
|
+
/Parent 543 0 R
|
|
313
|
+
/Resources << /Font << /F2 575 0 R /T1_0 504 0 R /F4 573 0 R /T1_4 512 0 R /T1_3 511 0 R >>
|
|
314
|
+
/Shading << /S12 508 0 R >> /XObject << /Im4 51 0 R >> /ExtGState 47 0 R
|
|
315
|
+
/ProcSet [ /PDF /Text /ImageB ] /ColorSpace 534 0 R >>
|
|
316
|
+
/Contents 48 0 R
|
|
317
|
+
/BleedBox [ 0 0 651 898 ]
|
|
318
|
+
/MediaBox [ 0 0 651 898 ]
|
|
319
|
+
/TrimBox [ 28 28 623 870 ]
|
|
320
|
+
/CropBox [ 28 28 623 870 ]
|
|
321
|
+
/ArtBox [ 28 28 623 870 ]
|
|
322
|
+
/LastModified (D:20021210105029+01')
|
|
323
|
+
/Rotate 0
|
|
324
|
+
>>
|
|
325
|
+
endobj
|
|
326
|
+
ENDOFSRC
|
|
327
|
+
obj = Rpdf2txt::PdfObject.new(src)
|
|
328
|
+
attributes = obj.attributes
|
|
329
|
+
assert_equal(Hash, attributes.class)
|
|
330
|
+
assert_equal(11, attributes.size)
|
|
331
|
+
assert_equal(0, obj.revision_id)
|
|
332
|
+
end
|
|
333
|
+
def test_parse_content_from_complex_attributes2
|
|
334
|
+
src = <<-ENDOFSRC
|
|
335
|
+
568 0 obj
|
|
336
|
+
<<
|
|
337
|
+
/Linearized 1
|
|
338
|
+
/O 570
|
|
339
|
+
/H [ 1049 1249 ]
|
|
340
|
+
/L 910845
|
|
341
|
+
/E 169588
|
|
342
|
+
/N 108
|
|
343
|
+
/T 899366
|
|
344
|
+
>>
|
|
345
|
+
endobj
|
|
346
|
+
|
|
347
|
+
ENDOFSRC
|
|
348
|
+
obj = Rpdf2txt::PdfObject.new(src)
|
|
349
|
+
attributes = obj.attributes
|
|
350
|
+
assert_equal(Hash, attributes.class)
|
|
351
|
+
assert_equal(7, attributes.size)
|
|
352
|
+
end
|
|
353
|
+
def test_parse_pantone
|
|
354
|
+
src = <<-ENDOFSRC
|
|
355
|
+
2 0 obj
|
|
356
|
+
<<
|
|
357
|
+
/JT 150 0 R
|
|
358
|
+
/AGFA_NORN_V (ES15.101 V03)
|
|
359
|
+
/AGFA_PSE_V (Apogee Norm PSE 1.1 23 )
|
|
360
|
+
/AGFA_CMYKCCN << /PANTONE#20379#20CV [ 0.08501 0 0.60001 0 ] /PANTONE#20192#20CV [ 0 0.94 0.64999 0 ]
|
|
361
|
+
/PANTONE#20199#20CV [ 0 1 0.64999 0 ] /PANTONE#20383#20CV [ 0.185 0 1 0.185 ]
|
|
362
|
+
/PANTONE#20375#20CV [ 0.42999 0 0.78999 0 ] /PANTONE#20100#20CV [ 0 0 0.50999 0 ]
|
|
363
|
+
/PANTONE#20281#20CV [ 1 0.72 0 0.38 ] /PANTONE#20185#20CV [ 0 0.91 0.75999 0 ]
|
|
364
|
+
/PANTONE#20377#20CV [ 0.42999 0 1 0.235 ] /PANTONE#203015#20CV [ 1 0.235 0 0.185 ]
|
|
365
|
+
/PANTONE#20195#20CV [ 0 0.75999 0.56 0.56 ] /PANTONE#20381#20CV [ 0.185 0 0.91 0 ]
|
|
366
|
+
/PANTONE#20Cl#20Gy#207#20CV [ 0 0 0 0.47 ] /PANTONE#20137#20CV [ 0 0.34 0.91 0 ]
|
|
367
|
+
/PANTONE#20397#20CV [ 0.11501 0 1 0.11501 ] /PANTONE#20322#20CV [ 1 0 0.38 0.30499 ]
|
|
368
|
+
/PANTONE#20382#20CV [ 0.30499 0 0.94 0 ] /PANTONE#20376#20CV [ 0.56 0 1 0 ] >>
|
|
369
|
+
/Type /Catalog
|
|
370
|
+
/Pages 55 0 R
|
|
371
|
+
/Outlines 15 1 R
|
|
372
|
+
>>
|
|
373
|
+
endobj
|
|
374
|
+
ENDOFSRC
|
|
375
|
+
obj = Rpdf2txt::PdfObject.new(src)
|
|
376
|
+
attributes = obj.attributes
|
|
377
|
+
assert_equal(Hash, attributes.class)
|
|
378
|
+
assert_equal(7, attributes.size)
|
|
379
|
+
end
|
|
380
|
+
def test_parse_escaped
|
|
381
|
+
src =
|
|
382
|
+
'<<
|
|
383
|
+
/O (foo\\)
|
|
384
|
+
>>'
|
|
385
|
+
obj = nil
|
|
386
|
+
assert_nothing_raised {
|
|
387
|
+
obj = Rpdf2txt::PdfObject.new(src)
|
|
388
|
+
}
|
|
389
|
+
assert_equal({:o => 'foo\\'}, obj.attributes)
|
|
390
|
+
end
|
|
391
|
+
def test_parse_limits
|
|
392
|
+
src = <<-EOS
|
|
393
|
+
31 0 obj
|
|
394
|
+
<<
|
|
395
|
+
/Limits [ <FEFF00530077006900730073006D0065006400690063002E006A006F0062006F
|
|
396
|
+
007000740069006F006E0073> <FEFF00530077006900730073006D0065006400690063002E006A006F0062006F
|
|
397
|
+
007000740069006F006E0073> ]
|
|
398
|
+
/Names [ <FEFF00530077006900730073006D0065006400690063002E006A006F0062006F
|
|
399
|
+
007000740069006F006E0073> 141 0 R ]
|
|
400
|
+
>>
|
|
401
|
+
endobj
|
|
402
|
+
EOS
|
|
403
|
+
obj = nil
|
|
404
|
+
assert_nothing_raised {
|
|
405
|
+
obj = Rpdf2txt::PdfObject.new(src)
|
|
406
|
+
}
|
|
407
|
+
expected = {
|
|
408
|
+
:names => ["<FEFF00530077006900730073006D0065006400690063002E006A006F0062006F\n007000740069006F006E0073>",
|
|
409
|
+
"141 0 R"],
|
|
410
|
+
:limits => ["<FEFF00530077006900730073006D0065006400690063002E006A006F0062006F\n007000740069006F006E0073>",
|
|
411
|
+
"<FEFF00530077006900730073006D0065006400690063002E006A006F0062006F\n007000740069006F006E0073>"]}
|
|
412
|
+
assert_equal expected, obj.attributes
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
class TestText < Test::Unit::TestCase
|
|
416
|
+
def test_get_font
|
|
417
|
+
font_src = <<-EOS
|
|
418
|
+
580 0 obj
|
|
419
|
+
<<
|
|
420
|
+
/Type /Font
|
|
421
|
+
/Subtype /Type1
|
|
422
|
+
/FirstChar 32
|
|
423
|
+
/LastChar 240
|
|
424
|
+
/Widths [ 278 389 500 556 556 1000 722 278 333 333 556 600 278 389 278 278
|
|
425
|
+
556 556 556 556 556 556 556 556 556 556 278 278 600 600 600 500
|
|
426
|
+
800 722 611 611 722 556 500 722 722 278 389 667 500 944 722 778
|
|
427
|
+
556 778 611 556 556 722 667 1000 667 667 556 389 278 389 600 500
|
|
428
|
+
278 556 611 444 611 556 389 611 611 278 278 556 278 889 611 611
|
|
429
|
+
611 611 389 444 389 611 556 889 556 556 500 333 222 333 600 278
|
|
430
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611
|
|
431
|
+
0 0 0 0 556 556 0 0 0 0 0 800 0 0 0 278 0 0 278 600 278 278 0 611
|
|
432
|
+
278 278 278 278 278 0 0 278 0 0 0 0 0 278 0 278 278 0 0 0 278 0
|
|
433
|
+
0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
434
|
+
0 0 0 0 0 278 ]
|
|
435
|
+
/Encoding /MacRomanEncoding
|
|
436
|
+
/BaseFont /Frutiger-BoldItalic
|
|
437
|
+
/FontDescriptor 579 0 R
|
|
438
|
+
>>
|
|
439
|
+
endobj
|
|
440
|
+
EOS
|
|
441
|
+
page_src = <<-EOS
|
|
442
|
+
570 0 obj
|
|
443
|
+
<<
|
|
444
|
+
/Type /Page
|
|
445
|
+
/Parent 540 0 R
|
|
446
|
+
/Resources 571 0 R
|
|
447
|
+
/Contents 576 0 R
|
|
448
|
+
/BleedBox [ 0 0 651 898 ]
|
|
449
|
+
/MediaBox [ 0 0 651 898 ]
|
|
450
|
+
/TrimBox [ 28 28 623 870 ]
|
|
451
|
+
/CropBox [ 28 28 623 870 ]
|
|
452
|
+
/ArtBox [ 28 28 623 870 ]
|
|
453
|
+
/Rotate 0
|
|
454
|
+
>>
|
|
455
|
+
endobj
|
|
456
|
+
EOS
|
|
457
|
+
rsrc_src = <<-EOS
|
|
458
|
+
571 0 obj
|
|
459
|
+
<<
|
|
460
|
+
/ProcSet [ /PDF /Text /ImageC ]
|
|
461
|
+
/Font << /F1 580 0 R /F2 575 0 R /F3 578 0 R /F4 573 0 R >>
|
|
462
|
+
/XObject << /Im1 587 0 R >>
|
|
463
|
+
/ExtGState << /GS2 585 0 R /GS3 584 0 R >>
|
|
464
|
+
/Shading << /Sh1 590 0 R >>
|
|
465
|
+
>>
|
|
466
|
+
endobj
|
|
467
|
+
EOS
|
|
468
|
+
font = Rpdf2txt::Font.new(font_src)
|
|
469
|
+
page = Rpdf2txt::PageLeaf.new(page_src)
|
|
470
|
+
rsrc = Rpdf2txt::Resource.new(rsrc_src)
|
|
471
|
+
page.build_tree({580=>font,571=>rsrc})
|
|
472
|
+
text = Rpdf2txt::Text.new("(Hello World)")
|
|
473
|
+
text.current_page = page
|
|
474
|
+
get_font = text.get_font("F1")
|
|
475
|
+
assert_equal(Rpdf2txt::Font, get_font.class)
|
|
476
|
+
assert_equal(font, get_font)
|
|
477
|
+
assert_equal(true, font.bold?)
|
|
478
|
+
assert_equal(true, font.italic?)
|
|
479
|
+
assert_equal("/Frutiger-BoldItalic", font.basefont_name)
|
|
480
|
+
end
|
|
481
|
+
def test_font_no_width
|
|
482
|
+
font_src = <<-EOS
|
|
483
|
+
327 0 obj
|
|
484
|
+
<<
|
|
485
|
+
/Type /Font
|
|
486
|
+
/Subtype /Type1
|
|
487
|
+
/Encoding 370 0 R
|
|
488
|
+
/BaseFont /Symbol
|
|
489
|
+
>>
|
|
490
|
+
endobj
|
|
491
|
+
EOS
|
|
492
|
+
page_src = <<-EOS
|
|
493
|
+
10 0 obj
|
|
494
|
+
<<
|
|
495
|
+
/Type /Page
|
|
496
|
+
/Parent 390 0 R
|
|
497
|
+
/Resources 11 0 R
|
|
498
|
+
/Contents 12 0 R
|
|
499
|
+
/MediaBox [ 0 0 595 841 ]
|
|
500
|
+
/CropBox [ 0 0 595 841 ]
|
|
501
|
+
/Rotate 0
|
|
502
|
+
>>
|
|
503
|
+
endobj
|
|
504
|
+
EOS
|
|
505
|
+
rsrc_src = <<-EOS
|
|
506
|
+
11 0 obj
|
|
507
|
+
<<
|
|
508
|
+
/ProcSet [ /PDF /Text ]
|
|
509
|
+
/Font << /F1 416 0 R /F2 408 0 R /F4 410 0 R /F6 325 0 R /F8 327 0 R >>
|
|
510
|
+
/ExtGState << /GS1 422 0 R >>
|
|
511
|
+
>>
|
|
512
|
+
endobj
|
|
513
|
+
EOS
|
|
514
|
+
txt_src = <<-EOS
|
|
515
|
+
BT
|
|
516
|
+
/F8 1 Tf
|
|
517
|
+
(Hello World) Tj
|
|
518
|
+
ET
|
|
519
|
+
EOS
|
|
520
|
+
font = Rpdf2txt::Font.new(font_src)
|
|
521
|
+
page = Rpdf2txt::PageLeaf.new(page_src)
|
|
522
|
+
rsrc = Rpdf2txt::Resource.new(rsrc_src)
|
|
523
|
+
page.build_tree({327=>font,11=>rsrc})
|
|
524
|
+
text = Rpdf2txt::Text.new(txt_src)
|
|
525
|
+
text.current_page = page
|
|
526
|
+
assert_nothing_raised {
|
|
527
|
+
text.scan
|
|
528
|
+
}
|
|
529
|
+
end
|
|
530
|
+
end
|
|
531
|
+
class TestEncrypt < Test::Unit::TestCase
|
|
532
|
+
def setup
|
|
533
|
+
file = File.expand_path('./data/encrypt_string', File.dirname(__FILE__))
|
|
534
|
+
src_encrypt_obj = File.read(file)
|
|
535
|
+
@encrypt = Rpdf2txt::PdfEncrypt.new(src_encrypt_obj)
|
|
536
|
+
@encrypt.file_id = '8664e6986751f2a49dccc9a4b40a4f18'
|
|
537
|
+
end
|
|
538
|
+
def test_decrypt
|
|
539
|
+
file = File.expand_path('./data/working_obj', File.dirname(__FILE__))
|
|
540
|
+
input = File.read(file)
|
|
541
|
+
pdf_obj = Rpdf2txt::Stream.new(input)
|
|
542
|
+
assert_equal("dc08b36009e48618f99c", @encrypt.decrypt_key(pdf_obj).unpack('h*').first)
|
|
543
|
+
#if the stream could be inflated, the decryption is ok!
|
|
544
|
+
assert_nothing_raised{
|
|
545
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
546
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
547
|
+
}
|
|
548
|
+
end
|
|
549
|
+
def test_decrypt2
|
|
550
|
+
file = File.expand_path('./data/90_obj', File.dirname(__FILE__))
|
|
551
|
+
input = File.read(file)
|
|
552
|
+
pdf_obj = Rpdf2txt::Stream.new(input)
|
|
553
|
+
assert_equal("7617ca1ac5babcf09cdf", @encrypt.decrypt_key(pdf_obj).unpack('h*').first)
|
|
554
|
+
#if the stream could be inflated, the decryption is ok!
|
|
555
|
+
assert_nothing_raised{
|
|
556
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
557
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
558
|
+
}
|
|
559
|
+
end
|
|
560
|
+
def test_decrypt3
|
|
561
|
+
file = File.expand_path('./data/working_obj2', File.dirname(__FILE__))
|
|
562
|
+
input = File.read(file)
|
|
563
|
+
pdf_obj = Rpdf2txt::Stream.new(input)
|
|
564
|
+
assert_equal("a9a666959bd64a96551b", @encrypt.decrypt_key(pdf_obj).unpack('h*').first)
|
|
565
|
+
#if the stream could be inflated, the decryption is ok!
|
|
566
|
+
assert_nothing_raised{
|
|
567
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
568
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
569
|
+
}
|
|
570
|
+
end
|
|
571
|
+
def test_decrypt5
|
|
572
|
+
file = File.expand_path('./data/458_obj', File.dirname(__FILE__))
|
|
573
|
+
input = File.read(file)
|
|
574
|
+
pdf_obj = Rpdf2txt::Stream.new(input)
|
|
575
|
+
#assert_equal("1aaeedd5d5304b79709b", @encrypt.decrypt_key(pdf_obj).unpack('h*').first)
|
|
576
|
+
#if the stream could be inflated, the decryption is ok!
|
|
577
|
+
assert_nothing_raised{
|
|
578
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
579
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
580
|
+
}
|
|
581
|
+
end
|
|
582
|
+
def test_decrypt6
|
|
583
|
+
file = File.expand_path('./data/450_obj', File.dirname(__FILE__))
|
|
584
|
+
input = File.read(file)
|
|
585
|
+
pdf_obj = Rpdf2txt::Stream.new(input)
|
|
586
|
+
#assert_equal("1aaeedd5d5304b79709b", @encrypt.decrypt_key(pdf_obj).unpack('h*').first)
|
|
587
|
+
#if the stream could be inflated, the decryption is ok!
|
|
588
|
+
assert_nothing_raised{
|
|
589
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
590
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
591
|
+
}
|
|
592
|
+
end
|
|
593
|
+
def test_decrypt7
|
|
594
|
+
file = File.expand_path('./data/465_obj', File.dirname(__FILE__))
|
|
595
|
+
input = File.read(file)
|
|
596
|
+
pdf_obj = Rpdf2txt::Stream.new(input)
|
|
597
|
+
#assert_equal("1aaeedd5d5304b79709b", @encrypt.decrypt_key(pdf_obj).unpack('h*').first)
|
|
598
|
+
#if the stream could be inflated, the decryption is ok!
|
|
599
|
+
assert_nothing_raised{
|
|
600
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
601
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
602
|
+
}
|
|
603
|
+
end
|
|
604
|
+
def test_decrypt_key
|
|
605
|
+
file = File.expand_path('./data/encrypt_obj', File.dirname(__FILE__))
|
|
606
|
+
src = File.read(file)
|
|
607
|
+
#byte position important! do not indent these lines!!!
|
|
608
|
+
obj_src = <<-EOS
|
|
609
|
+
473 0 obj
|
|
610
|
+
<< /N 3 /Alternate /DeviceRGB /Length 2575 /Filter /FlateDecode >>
|
|
611
|
+
endobj
|
|
612
|
+
EOS
|
|
613
|
+
pdf_obj = Rpdf2txt::Stream.new(obj_src)
|
|
614
|
+
encrypt = Rpdf2txt::PdfEncrypt.new(src)
|
|
615
|
+
encrypt.file_id = '8664e6986751f2a49dccc9a4b40a4f18'
|
|
616
|
+
#puts encrypt.decrypt_key(pdf_obj)
|
|
617
|
+
assert_equal("dc08b36009e48618f99c", encrypt.decrypt_key(pdf_obj).unpack('h*').first)
|
|
618
|
+
end
|
|
619
|
+
def test_inflate_obj
|
|
620
|
+
file = File.expand_path('./data/90_obj_comp', File.dirname(__FILE__))
|
|
621
|
+
input = File.read(file)
|
|
622
|
+
input = [input].pack('H*')
|
|
623
|
+
# puts input
|
|
624
|
+
assert_nothing_raised{
|
|
625
|
+
Zlib::Inflate.inflate(input)
|
|
626
|
+
# Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
627
|
+
}
|
|
628
|
+
end
|
|
629
|
+
def test_parse_encrypt
|
|
630
|
+
file = File.expand_path('./data/encrypt_obj', File.dirname(__FILE__))
|
|
631
|
+
src = File.read(file)
|
|
632
|
+
encrypt = Rpdf2txt::PdfEncrypt.new(src)
|
|
633
|
+
encrypt.file_id = '8664e6986751f2a49dccc9a4b40a4f18'
|
|
634
|
+
assert_equal("00ecc7a7bf8d68c564a21b98258b1dbff2aaf8d24bfdbaa74a9a073467d896b6", encrypt.user_key.unpack("H*").first)
|
|
635
|
+
assert_equal("2055c756c72e1ad702608e8196acad447ad32d17cff583235f6dd15fed7dab67", encrypt.owner_key.unpack("H*").first)
|
|
636
|
+
assert_nothing_raised{
|
|
637
|
+
encrypt.encryption_key
|
|
638
|
+
}
|
|
639
|
+
end
|
|
640
|
+
def test_endianess
|
|
641
|
+
file = File.expand_path('./data/encrypt_obj', File.dirname(__FILE__))
|
|
642
|
+
src = File.read(file)
|
|
643
|
+
encrypt = Rpdf2txt::PdfEncrypt.new(src)
|
|
644
|
+
encrypt.big_endian?
|
|
645
|
+
end
|
|
646
|
+
end
|
|
647
|
+
class TestEncrypt128bit < Test::Unit::TestCase
|
|
648
|
+
def setup
|
|
649
|
+
file = File.expand_path('./data/encrypt_string_128bit',
|
|
650
|
+
File.dirname(__FILE__))
|
|
651
|
+
src_encrypt_obj = File.read(file)
|
|
652
|
+
@encrypt = Rpdf2txt::PdfEncrypt.new(src_encrypt_obj)
|
|
653
|
+
@encrypt.file_id = 'D816A5E838D50653C19DB62504229EB6'
|
|
654
|
+
end
|
|
655
|
+
def test_decrypt8
|
|
656
|
+
file = File.expand_path('./data/3392_obj', File.dirname(__FILE__))
|
|
657
|
+
input = File.read(file)
|
|
658
|
+
pdf_obj = Rpdf2txt::Stream.new(input)
|
|
659
|
+
#if the stream could be inflated, the decryption is ok!
|
|
660
|
+
assert_nothing_raised{
|
|
661
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
662
|
+
Zlib::Inflate.inflate(@encrypt.decrypt(pdf_obj))
|
|
663
|
+
}
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
class TestTrailer < Test::Unit::TestCase
|
|
667
|
+
def test_parse_trail
|
|
668
|
+
src ='
|
|
669
|
+
trailer
|
|
670
|
+
<<
|
|
671
|
+
/Size 476
|
|
672
|
+
/Info 388 0 R
|
|
673
|
+
/Encrypt 395 0 R
|
|
674
|
+
/Root 394 0 R
|
|
675
|
+
/Prev 203754
|
|
676
|
+
/ID[<8664e6986751f2a49dccc9a4b40a4f18v><e720b2184372f5e3f4edd86673b81dfd>]
|
|
677
|
+
>>
|
|
678
|
+
startxref'
|
|
679
|
+
expected = "8664e6986751f2a49dccc9a4b40a4f18v"
|
|
680
|
+
node = Rpdf2txt::TrailerDictionary.new(src)
|
|
681
|
+
assert_equal(expected, node.file_id)
|
|
682
|
+
end
|
|
683
|
+
end
|
|
684
|
+
class TestFont < Test::Unit::TestCase
|
|
685
|
+
def test_encoding
|
|
686
|
+
src = <<-EOS
|
|
687
|
+
580 0 obj
|
|
688
|
+
<<
|
|
689
|
+
/Type /Font
|
|
690
|
+
/Subtype /Type1
|
|
691
|
+
/FirstChar 32
|
|
692
|
+
/LastChar 240
|
|
693
|
+
/Widths [ 278 389 500 556 556 1000 722 278 333 333 556 600 278 389 278 278
|
|
694
|
+
556 556 556 556 556 556 556 556 556 556 278 278 600 600 600 500
|
|
695
|
+
800 722 611 611 722 556 500 722 722 278 389 667 500 944 722 778
|
|
696
|
+
556 778 611 556 556 722 667 1000 667 667 556 389 278 389 600 500
|
|
697
|
+
278 556 611 444 611 556 389 611 611 278 278 556 278 889 611 611
|
|
698
|
+
611 611 389 444 389 611 556 889 556 556 500 333 222 333 600 278
|
|
699
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611
|
|
700
|
+
0 0 0 0 556 556 0 0 0 0 0 800 0 0 0 278 0 0 278 600 278 278 0 611
|
|
701
|
+
278 278 278 278 278 0 0 278 0 0 0 0 0 278 0 278 278 0 0 0 278 0
|
|
702
|
+
0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
703
|
+
0 0 0 0 0 278 ]
|
|
704
|
+
/Encoding /MacRomanEncoding
|
|
705
|
+
/BaseFont /Frutiger-BoldItalic
|
|
706
|
+
/FontDescriptor 579 0 R
|
|
707
|
+
>>
|
|
708
|
+
endobj
|
|
709
|
+
EOS
|
|
710
|
+
font = Rpdf2txt::Font.new(src)
|
|
711
|
+
assert_equal("mac", font.encoding)
|
|
712
|
+
end
|
|
713
|
+
def test_width
|
|
714
|
+
src = <<-EOS
|
|
715
|
+
580 0 obj
|
|
716
|
+
<<
|
|
717
|
+
/Type /Font
|
|
718
|
+
/Subtype /Type1
|
|
719
|
+
/FirstChar 32
|
|
720
|
+
/LastChar 240
|
|
721
|
+
/Widths [ 278 389 500 556 556 1000 722 278 333 333 556 600 278 389 278 278
|
|
722
|
+
556 556 556 556 556 556 556 556 556 556 278 278 600 600 600 500
|
|
723
|
+
800 722 611 611 722 556 500 722 722 278 389 667 500 944 722 778
|
|
724
|
+
556 778 611 556 556 722 667 1000 667 667 556 389 278 389 600 500
|
|
725
|
+
278 556 611 444 611 556 389 611 611 278 278 556 278 889 611 611
|
|
726
|
+
611 611 389 444 389 611 556 889 556 556 500 333 222 333 600 278
|
|
727
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611
|
|
728
|
+
0 0 0 0 556 556 0 0 0 0 0 800 0 0 0 278 0 0 278 600 278 278 0 611
|
|
729
|
+
278 278 278 278 278 0 0 278 0 0 0 0 0 278 0 278 278 0 0 0 278 0
|
|
730
|
+
0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
731
|
+
0 0 0 0 0 278 ]
|
|
732
|
+
/Encoding /MacRomanEncoding
|
|
733
|
+
/BaseFont /Frutiger-BoldItalic
|
|
734
|
+
/FontDescriptor 579 0 R
|
|
735
|
+
>>
|
|
736
|
+
endobj
|
|
737
|
+
EOS
|
|
738
|
+
font = Rpdf2txt::Font.new(src)
|
|
739
|
+
assert_equal(278, font.width(' '))
|
|
740
|
+
assert_equal(556, font.width('a'))
|
|
741
|
+
end
|
|
742
|
+
def test_width__builtin
|
|
743
|
+
src = <<-EOS
|
|
744
|
+
580 0 obj
|
|
745
|
+
<<
|
|
746
|
+
/Type /Font
|
|
747
|
+
/Subtype /Type1
|
|
748
|
+
/FirstChar 32
|
|
749
|
+
/LastChar 240
|
|
750
|
+
/Encoding /MacRomanEncoding
|
|
751
|
+
/BaseFont /Symbol
|
|
752
|
+
/FontDescriptor 579 0 R
|
|
753
|
+
>>
|
|
754
|
+
endobj
|
|
755
|
+
EOS
|
|
756
|
+
font = Rpdf2txt::Font.new(src)
|
|
757
|
+
assert_equal(250, font.width(' '))
|
|
758
|
+
assert_equal(763, font.width(70))
|
|
759
|
+
assert_equal(631, font.width('alpha'))
|
|
760
|
+
end
|
|
761
|
+
def test_width__differences
|
|
762
|
+
encoding = <<-EOS
|
|
763
|
+
252 0 obj
|
|
764
|
+
<<
|
|
765
|
+
/Type /Encoding
|
|
766
|
+
/Differences [ 1 /space /beta /alpha ]
|
|
767
|
+
>>
|
|
768
|
+
endobj
|
|
769
|
+
EOS
|
|
770
|
+
font = <<-EOS
|
|
771
|
+
219 0 obj
|
|
772
|
+
<<
|
|
773
|
+
/Type /Font
|
|
774
|
+
/Subtype /Type1
|
|
775
|
+
/Encoding 252 0 R
|
|
776
|
+
/BaseFont /Symbol
|
|
777
|
+
/ToUnicode 253 0 R
|
|
778
|
+
>>
|
|
779
|
+
endobj
|
|
780
|
+
EOS
|
|
781
|
+
tounicode = <<-EOS
|
|
782
|
+
253 0 obj
|
|
783
|
+
<< /Filter /FlateDecode /Length 227 >>
|
|
784
|
+
stream
|
|
785
|
+
H�TP�n� ���-��[�"���%�8I�am!a\��9)#v���^Ʒљ���0�b����=*�W�w��J����@�x:��vt��a �37�8M�������~D�ѸN_��'��-��������bn7i�y�5nA*�ҭ�"C/���#�C1/��=��:&2ѕ{���+D��
|
|
786
|
+
�ɞ�b_��L��s��4�;>�P�_Eo�
|
|
787
|
+
endstream
|
|
788
|
+
endobj
|
|
789
|
+
EOS
|
|
790
|
+
font = Rpdf2txt::Font.new(font)
|
|
791
|
+
font.attributes[:encoding] = Rpdf2txt::Encoding.new(encoding)
|
|
792
|
+
font.attributes[:to_unicode] = Rpdf2txt::Stream.new(tounicode).to_cmap
|
|
793
|
+
assert_equal(631, font.width('alpha'))
|
|
794
|
+
assert_equal(631, font.width(3))
|
|
795
|
+
end
|
|
796
|
+
end
|
|
797
|
+
class TestPageLeaf < Test::Unit::TestCase
|
|
798
|
+
def test_text_cm
|
|
799
|
+
stream = Stream.new
|
|
800
|
+
stream.decoded_stream = <<-'EOS'
|
|
801
|
+
q
|
|
802
|
+
1 0 0 -1 70.866 841.89 cm
|
|
803
|
+
0 J
|
|
804
|
+
1 1 1 RG
|
|
805
|
+
q
|
|
806
|
+
-1.5 -1.5 m
|
|
807
|
+
455.043 -1.5 l
|
|
808
|
+
452.043 1.5 l
|
|
809
|
+
1.5 1.5 l
|
|
810
|
+
W*
|
|
811
|
+
n
|
|
812
|
+
-0.5 0 m
|
|
813
|
+
454.043 0 l
|
|
814
|
+
S
|
|
815
|
+
Q
|
|
816
|
+
q
|
|
817
|
+
455.043 -1.5 m
|
|
818
|
+
455.043 32.5 l
|
|
819
|
+
452.043 29.5 l
|
|
820
|
+
452.043 1.5 l
|
|
821
|
+
W*
|
|
822
|
+
n
|
|
823
|
+
453.543 -0.5 m
|
|
824
|
+
453.543 31.5 l
|
|
825
|
+
S
|
|
826
|
+
Q
|
|
827
|
+
q
|
|
828
|
+
455.043 32.5 m
|
|
829
|
+
-1.5 32.5 l
|
|
830
|
+
1.5 29.5 l
|
|
831
|
+
452.043 29.5 l
|
|
832
|
+
W*
|
|
833
|
+
n
|
|
834
|
+
454.043 31 m
|
|
835
|
+
-0.5 31 l
|
|
836
|
+
S
|
|
837
|
+
Q
|
|
838
|
+
q
|
|
839
|
+
-1.5 32.5 m
|
|
840
|
+
-1.5 -1.5 l
|
|
841
|
+
1.5 1.5 l
|
|
842
|
+
1.5 29.5 l
|
|
843
|
+
W*
|
|
844
|
+
n
|
|
845
|
+
0 31.5 m
|
|
846
|
+
0 -0.5 l
|
|
847
|
+
S
|
|
848
|
+
Q
|
|
849
|
+
1 0 0 1 0.5 31.5 cm
|
|
850
|
+
0 0 0 rg
|
|
851
|
+
BT
|
|
852
|
+
/F0 8 Tf
|
|
853
|
+
1 0 0 -1 232.336 7.573 Tm
|
|
854
|
+
[(1. position: 7.573 offset: 31.5)] TJ
|
|
855
|
+
ET
|
|
856
|
+
1 0 0 1 -0.5 -0.5 cm
|
|
857
|
+
q
|
|
858
|
+
455.043 -1.5 m
|
|
859
|
+
455.043 12.1 l
|
|
860
|
+
452.043 9.1 l
|
|
861
|
+
452.043 1.5 l
|
|
862
|
+
W*
|
|
863
|
+
n
|
|
864
|
+
453.543 -0.5 m
|
|
865
|
+
453.543 11.1 l
|
|
866
|
+
S
|
|
867
|
+
Q
|
|
868
|
+
q
|
|
869
|
+
455.043 12.1 m
|
|
870
|
+
-1.5 12.1 l
|
|
871
|
+
1.5 9.1 l
|
|
872
|
+
452.043 9.1 l
|
|
873
|
+
W*
|
|
874
|
+
n
|
|
875
|
+
454.043 10.6 m
|
|
876
|
+
-0.5 10.6 l
|
|
877
|
+
S
|
|
878
|
+
Q
|
|
879
|
+
q
|
|
880
|
+
-1.5 12.1 m
|
|
881
|
+
-1.5 -1.5 l
|
|
882
|
+
1.5 1.5 l
|
|
883
|
+
1.5 9.1 l
|
|
884
|
+
W*
|
|
885
|
+
n
|
|
886
|
+
0 11.1 m
|
|
887
|
+
0 -0.5 l
|
|
888
|
+
S
|
|
889
|
+
Q
|
|
890
|
+
1 0 0 1 0 39.866 cm
|
|
891
|
+
BT
|
|
892
|
+
/F1 16 Tf
|
|
893
|
+
1 0 0 -1 0 14.347 Tm
|
|
894
|
+
(2. position: 14.347 offset: 39.866) Tj
|
|
895
|
+
0 0 0 RG
|
|
896
|
+
ET
|
|
897
|
+
0 30.173 m
|
|
898
|
+
453.543 30.173 l S
|
|
899
|
+
1 0 0 1 0 32.2 cm
|
|
900
|
+
BT
|
|
901
|
+
/F2 11 Tf
|
|
902
|
+
1 0 0 -1 314.813 10.413 Tm
|
|
903
|
+
(3. position: 10.413 offset: 32.2) Tj
|
|
904
|
+
ET
|
|
905
|
+
1 0 0 1 0 -32.2 cm
|
|
906
|
+
0 46.7 m
|
|
907
|
+
453.543 46.7 l
|
|
908
|
+
S
|
|
909
|
+
BT
|
|
910
|
+
/F2 8 Tf
|
|
911
|
+
1 0 0 -1 0 62.573 Tm
|
|
912
|
+
(4. position: 62.573 offset:-32.2) Tj
|
|
913
|
+
/F3 9 Tf
|
|
914
|
+
0 -14.547 Td
|
|
915
|
+
(5. moved by: -14.547) Tj
|
|
916
|
+
/F2 8 Tf
|
|
917
|
+
0 -15.853 Td
|
|
918
|
+
(6. moved by: -15.853) Tj
|
|
919
|
+
ET
|
|
920
|
+
EOS
|
|
921
|
+
page = PageLeaf.new
|
|
922
|
+
page.resources = Resource.new
|
|
923
|
+
handler = SimpleHandler.new
|
|
924
|
+
page.contents = [stream]
|
|
925
|
+
page.text(handler)
|
|
926
|
+
## a+b a-b
|
|
927
|
+
# 1. 39.073 -23.927
|
|
928
|
+
# 2. 54.213 -25.519
|
|
929
|
+
# 3. 42.613 -21.787
|
|
930
|
+
## fonts
|
|
931
|
+
# 1. F0 8
|
|
932
|
+
# 2. F1 16
|
|
933
|
+
# 3. F2 11
|
|
934
|
+
## a+b+f a+b-f a-b-f a-b+f
|
|
935
|
+
# 1. 47.073 31.073 -31.927 -15.926
|
|
936
|
+
# 2. 70.213 38.213 -41.519 - 9.519
|
|
937
|
+
# 3. 53.613 31.613 -32.787 -10.787
|
|
938
|
+
## a+f a-f
|
|
939
|
+
# 1. 15.573 -0.427
|
|
940
|
+
# 2. 30.347 -1.653
|
|
941
|
+
# 3. 21.413 -0.587
|
|
942
|
+
|
|
943
|
+
## 5 hrs -> 5 x newline
|
|
944
|
+
expected = <<-EOS
|
|
945
|
+
1. position: 7.573 offset: 31.5
|
|
946
|
+
2. position: 14.347 offset: 39.866
|
|
947
|
+
3. position: 10.413 offset: 32.2
|
|
948
|
+
4. position: 62.573 offset:-32.2
|
|
949
|
+
5. moved by: -14.547
|
|
950
|
+
6. moved by: -15.853
|
|
951
|
+
EOS
|
|
952
|
+
assert_equal(expected.strip, handler.out.strip)
|
|
953
|
+
end
|
|
954
|
+
def test_text__fixed_double_lead_bug
|
|
955
|
+
stream = Stream.new
|
|
956
|
+
stream.decoded_stream = <<-'EOS'
|
|
957
|
+
q
|
|
958
|
+
1 i
|
|
959
|
+
0.059998 34.407 618 -34.5 re
|
|
960
|
+
W* n
|
|
961
|
+
0 864.567 617.94 -864.54 re
|
|
962
|
+
W* n
|
|
963
|
+
/GS1 gs
|
|
964
|
+
q
|
|
965
|
+
324.71994 0 0 25.199999 -0.720012 10.166975 cm
|
|
966
|
+
/Im112 Do
|
|
967
|
+
Q
|
|
968
|
+
Q
|
|
969
|
+
q
|
|
970
|
+
1 i
|
|
971
|
+
617.04 11.127 0.89996 0.23999 re
|
|
972
|
+
W n
|
|
973
|
+
/GS1 gs
|
|
974
|
+
q
|
|
975
|
+
1.44 0 0 0.24 617.039978 11.126974 cm
|
|
976
|
+
/Im17 Do
|
|
977
|
+
Q
|
|
978
|
+
Q
|
|
979
|
+
q
|
|
980
|
+
1 i
|
|
981
|
+
0.059998 34.407 618 -34.5 re
|
|
982
|
+
W* n
|
|
983
|
+
0 864.567 617.94 -864.54 re
|
|
984
|
+
W* n
|
|
985
|
+
/GS1 gs
|
|
986
|
+
q
|
|
987
|
+
1.44 0 0 0.24 0.239988 10.886974 cm
|
|
988
|
+
/Im18 Do
|
|
989
|
+
Q
|
|
990
|
+
q
|
|
991
|
+
27.359999 0 0 0.24 295.679962 10.886974 cm
|
|
992
|
+
/Im16 Do
|
|
993
|
+
Q
|
|
994
|
+
Q
|
|
995
|
+
q
|
|
996
|
+
1 i
|
|
997
|
+
617.28 10.887 0.65997 0.24002 re
|
|
998
|
+
W n
|
|
999
|
+
/GS1 gs
|
|
1000
|
+
q
|
|
1001
|
+
0.96 0 0 0.24 617.279968 10.886974 cm
|
|
1002
|
+
/Im14 Do
|
|
1003
|
+
Q
|
|
1004
|
+
Q
|
|
1005
|
+
q
|
|
1006
|
+
1 i
|
|
1007
|
+
0.059998 34.407 618 -34.5 re
|
|
1008
|
+
W* n
|
|
1009
|
+
0 864.567 617.94 -864.54 re
|
|
1010
|
+
W* n
|
|
1011
|
+
/GS1 gs
|
|
1012
|
+
q
|
|
1013
|
+
597.599976 0 0 12.719999 10.319989 -0.873026 cm
|
|
1014
|
+
/Im113 Do
|
|
1015
|
+
Q
|
|
1016
|
+
Q
|
|
1017
|
+
q
|
|
1018
|
+
1 i
|
|
1019
|
+
11.28 0.026978 0.47998 0.059998 re
|
|
1020
|
+
W n
|
|
1021
|
+
/GS1 gs
|
|
1022
|
+
q
|
|
1023
|
+
0.48 0 0 0.24 11.279988 -0.153026 cm
|
|
1024
|
+
/Im2 Do
|
|
1025
|
+
Q
|
|
1026
|
+
Q
|
|
1027
|
+
q
|
|
1028
|
+
1 i
|
|
1029
|
+
606.48 0.026978 0.47998 0.059998 re
|
|
1030
|
+
W n
|
|
1031
|
+
/GS1 gs
|
|
1032
|
+
q
|
|
1033
|
+
0.48 0 0 0.24 606.47998 -0.153026 cm
|
|
1034
|
+
/Im2 Do
|
|
1035
|
+
Q
|
|
1036
|
+
Q
|
|
1037
|
+
q
|
|
1038
|
+
1 i
|
|
1039
|
+
0 864.567 617.94 -50.94 re
|
|
1040
|
+
W* n
|
|
1041
|
+
/GS1 gs
|
|
1042
|
+
q
|
|
1043
|
+
608.399963 0 0 13.200012 -0.960012 852.326965 cm
|
|
1044
|
+
/Im93 Do
|
|
1045
|
+
Q
|
|
1046
|
+
Q
|
|
1047
|
+
q
|
|
1048
|
+
1 i
|
|
1049
|
+
616.08 853.287 1.86 0.23999 re
|
|
1050
|
+
W n
|
|
1051
|
+
/GS1 gs
|
|
1052
|
+
q
|
|
1053
|
+
1.92 0 0 0.24 616.079956 853.286987 cm
|
|
1054
|
+
/Im44 Do
|
|
1055
|
+
Q
|
|
1056
|
+
Q
|
|
1057
|
+
q
|
|
1058
|
+
1 i
|
|
1059
|
+
0 864.567 617.94 -50.94 re
|
|
1060
|
+
W* n
|
|
1061
|
+
/GS1 gs
|
|
1062
|
+
q
|
|
1063
|
+
1.92 0 0 0.24 -0.000012 853.046936 cm
|
|
1064
|
+
/Im87 Do
|
|
1065
|
+
Q
|
|
1066
|
+
q
|
|
1067
|
+
240 0 0 0.24 7.439988 853.046936 cm
|
|
1068
|
+
/Im85 Do
|
|
1069
|
+
Q
|
|
1070
|
+
Q
|
|
1071
|
+
q
|
|
1072
|
+
1 i
|
|
1073
|
+
615.84 853.047 2.1 0.24005 re
|
|
1074
|
+
W n
|
|
1075
|
+
/GS1 gs
|
|
1076
|
+
q
|
|
1077
|
+
2.4 0 0 0.24 615.839966 853.046936 cm
|
|
1078
|
+
/Im59 Do
|
|
1079
|
+
Q
|
|
1080
|
+
Q
|
|
1081
|
+
q
|
|
1082
|
+
1 i
|
|
1083
|
+
0 864.567 617.94 -50.94 re
|
|
1084
|
+
W* n
|
|
1085
|
+
/GS1 gs
|
|
1086
|
+
q
|
|
1087
|
+
241.920013 0 0 41.040039 6.479988 812.966919 cm
|
|
1088
|
+
/Im88 Do
|
|
1089
|
+
Q
|
|
1090
|
+
q
|
|
1091
|
+
572.639954 0 0 0.24 39.359989 813.686951 cm
|
|
1092
|
+
/Im109 Do
|
|
1093
|
+
Q
|
|
1094
|
+
q
|
|
1095
|
+
572.639954 0 0 0.24 39.359989 813.44696 cm
|
|
1096
|
+
/Im109 Do
|
|
1097
|
+
Q
|
|
1098
|
+
Q
|
|
1099
|
+
/GS1 gs
|
|
1100
|
+
BT
|
|
1101
|
+
/F1 1 Tf
|
|
1102
|
+
10.02 0 0 10.02 48.24 821.187 Tm
|
|
1103
|
+
0 g
|
|
1104
|
+
-0.0006 Tc
|
|
1105
|
+
-0.002 Tw
|
|
1106
|
+
[(Arzneimittel Nachrichten )5.9(/ M�dicamen)5.6(t)-0.8(s )]TJ
|
|
1107
|
+
/F2 1 Tf
|
|
1108
|
+
7.02 0 0 7.02 87.9 24.987 Tm
|
|
1109
|
+
0.0023 Tc
|
|
1110
|
+
0.0017 Tw
|
|
1111
|
+
[(S)6.6(w)6.2(iss)6.7(m)2.4(ed)6.5(ic)10.4( Jo)6.5(u)6.5(r)-1.9(n)6.5(a)11.3(l 03)11.3(/200)11.3(6)11.3( )]TJ
|
|
1112
|
+
1 g
|
|
1113
|
+
30.6752 0 TD
|
|
1114
|
+
-0.0004 Tc
|
|
1115
|
+
0 Tw
|
|
1116
|
+
(226)Tj
|
|
1117
|
+
0 g
|
|
1118
|
+
1.6667 0 TD
|
|
1119
|
+
0 Tc
|
|
1120
|
+
( )Tj
|
|
1121
|
+
/F1 1 Tf
|
|
1122
|
+
11.52 0 0 11.52 96.42 773.3669 Tm
|
|
1123
|
+
-0.0006 Tc
|
|
1124
|
+
-0.0014 Tw
|
|
1125
|
+
[(Autorisa)3.3(tion d�un m�dicament co)6.2(ntenant un)6.2( nouveau principe actif: )]TJ
|
|
1126
|
+
0 -1.125 TD
|
|
1127
|
+
0 Tc
|
|
1128
|
+
0 Tw
|
|
1129
|
+
(M)Tj
|
|
1130
|
+
/F2 1 Tf
|
|
1131
|
+
10.02 0 0 10.02 96.42 742.527 Tm
|
|
1132
|
+
0 Tc
|
|
1133
|
+
0 Tw
|
|
1134
|
+
( )Tj
|
|
1135
|
+
/F1 1 Tf
|
|
1136
|
+
0 -1.1976 TD
|
|
1137
|
+
-0.0002 Tc
|
|
1138
|
+
0.1054 Tw
|
|
1139
|
+
[(En f�vrier 2)4.9(006, la pr�p)6(aration Mac)6.7(ugen)6(�)-2.6(, une )]TJ
|
|
1140
|
+
T*
|
|
1141
|
+
-0.0004 Tc
|
|
1142
|
+
0.1116 Tw
|
|
1143
|
+
[(solution injectable conte)4.7(n)-0.2(ant un nou)5.8(veau prin)5.8(-)]TJ
|
|
1144
|
+
T*
|
|
1145
|
+
-0.0002 Tc
|
|
1146
|
+
0.1893 Tw
|
|
1147
|
+
[(cipe actif, le pegapta)4.9(n)0(ib, a �t� autor)5.6(i)2.4(s�e dans)6.7( )]TJ
|
|
1148
|
+
T*
|
|
1149
|
+
-0.0005 Tc
|
|
1150
|
+
0.1357 Tw
|
|
1151
|
+
[(l�indication suivante )137.8(: � )137.8(T)4.6(r)-0.7(aitement )6(d)5.7(e)-1.4( la form)8.3(e )]TJ
|
|
1152
|
+
T*
|
|
1153
|
+
-0.0007 Tc
|
|
1154
|
+
0.3514 Tw
|
|
1155
|
+
[(n�ovasc)6.2(u)-0.5(laire \(h)5.5(umide\) )5.9(de la d)5.5(�)-1.6(g�n�rescence )]TJ
|
|
1156
|
+
T*
|
|
1157
|
+
-0.0019 Tw
|
|
1158
|
+
(maculaire li�e � l��ge�. )Tj
|
|
1159
|
+
T*
|
|
1160
|
+
-0.0001 Tc
|
|
1161
|
+
0.0395 Tw
|
|
1162
|
+
[(La dos)6.8(e auto)6.1(ris�e de 0,3 )47.9(mg de pegaptanib doit)5.7( )]TJ
|
|
1163
|
+
T*
|
|
1164
|
+
-0.0003 Tc
|
|
1165
|
+
0.4409 Tw
|
|
1166
|
+
[(�tre administr�e par )-6(i)8.2(n)-0.1(jection )-6(int)5.5(r)-0.5(avitr�)4.8(enne)4.8( )]TJ
|
|
1167
|
+
T*
|
|
1168
|
+
-0.0005 Tc
|
|
1169
|
+
-0.002 Tw
|
|
1170
|
+
[(toutes les six semaines \(9 )6(injections par an\). )]TJ
|
|
1171
|
+
T*
|
|
1172
|
+
0 Tc
|
|
1173
|
+
0 Tw
|
|
1174
|
+
( )Tj
|
|
1175
|
+
/F2 1 Tf
|
|
1176
|
+
T*
|
|
1177
|
+
-0.001 Tc
|
|
1178
|
+
0.4595 Tw
|
|
1179
|
+
[(Le )6(pegaptanib sodique est)4.8( un oli)7.5(gonucl�ide )]TJ
|
|
1180
|
+
T*
|
|
1181
|
+
-0.0014 Tc
|
|
1182
|
+
0.0767 Tw
|
|
1183
|
+
[(modifi� p�gy)-4.4(l� qui )6(se lie � l�isoforme VEGF)]TJ
|
|
1184
|
+
-21.4132 -1.1976 TD
|
|
1185
|
+
-0.001 Tc
|
|
1186
|
+
0.3158 Tw
|
|
1187
|
+
[(facteur)4.8( de c)5.9(r)-1.2(oissance de l�endoth�li)7.5(um vascu-)]TJ
|
|
1188
|
+
T*
|
|
1189
|
+
-0.0004 Tc
|
|
1190
|
+
0.1595 Tw
|
|
1191
|
+
[(laire \(VEGF\) )6(et inhibe so)5.8(n activit�. Le VEGF est)5.4( )]TJ
|
|
1192
|
+
T*
|
|
1193
|
+
-0.0006 Tc
|
|
1194
|
+
0.1957 Tw
|
|
1195
|
+
[(une prot)5.2(�in)5.6(e)-1.5( qui induit une angiog)5.6(en�se, un)5.6(e )]TJ
|
|
1196
|
+
T*
|
|
1197
|
+
-0.0009 Tc
|
|
1198
|
+
0.4295 Tw
|
|
1199
|
+
[(perm�abilit� v)-3.9(a)-1.8(sculaire )6(et une inflammation. )]TJ
|
|
1200
|
+
T*
|
|
1201
|
+
( )Tj
|
|
1202
|
+
ET
|
|
1203
|
+
EOS
|
|
1204
|
+
page = PageLeaf.new
|
|
1205
|
+
page.resources = Resource.new
|
|
1206
|
+
handler = SimpleHandler.new
|
|
1207
|
+
page.contents = [stream]
|
|
1208
|
+
page.text(handler)
|
|
1209
|
+
expected = <<-EOS.strip
|
|
1210
|
+
Arzneimittel Nachrichten / M\351dicaments
|
|
1211
|
+
Autorisation d\222un m\351dicament contenant un nouveau principe actif:
|
|
1212
|
+
M
|
|
1213
|
+
|
|
1214
|
+
En f\351vrier 2006, la pr\351paration Macugen\256, une
|
|
1215
|
+
solution injectable contenant un nouveau prin-
|
|
1216
|
+
cipe actif, le pegaptanib, a \351t\351 autoris\351e dans
|
|
1217
|
+
l\222indication suivante : \253 Traitement de la forme
|
|
1218
|
+
n\351ovasculaire (humide) de la d\351g\351n\351rescence
|
|
1219
|
+
maculaire li\351e \340 l\222\342ge\273.
|
|
1220
|
+
La dose autoris\351e de 0,3 mg de pegaptanib doit
|
|
1221
|
+
\352tre administr\351e par injection intravitr\351enne
|
|
1222
|
+
toutes les six semaines (9 injections par an).
|
|
1223
|
+
|
|
1224
|
+
Le pegaptanib sodique est un oligonucl\351ide
|
|
1225
|
+
modifi\351 p\351gyl\351 qui se lie \340 l\222isoforme VEGF
|
|
1226
|
+
facteur de croissance de l\222endoth\351lium vascu-
|
|
1227
|
+
laire (VEGF) et inhibe son activit\351. Le VEGF est
|
|
1228
|
+
une prot\351ine qui induit une angiogen\350se, une
|
|
1229
|
+
perm\351abilit\351 vasculaire et une inflammation.
|
|
1230
|
+
|
|
1231
|
+
Swissmedic Journal 03/2006 226
|
|
1232
|
+
EOS
|
|
1233
|
+
result = handler.out.strip
|
|
1234
|
+
=begin
|
|
1235
|
+
[expected.size, result.size].max.times do |idx|
|
|
1236
|
+
unless result[idx] == expected[idx]
|
|
1237
|
+
flunk "unexpected result: (#{result[idx]}/#{expected[idx]} at #{idx}) ...#{expected[idx-10,20].inspect}..."
|
|
1238
|
+
end
|
|
1239
|
+
end
|
|
1240
|
+
=end
|
|
1241
|
+
assert_equal(expected, result)
|
|
1242
|
+
end
|
|
1243
|
+
def test_text_landscape
|
|
1244
|
+
stream = Stream.new
|
|
1245
|
+
stream.decoded_stream = <<-'EOS'
|
|
1246
|
+
/GS1 gs
|
|
1247
|
+
BT
|
|
1248
|
+
/TT2 1 Tf
|
|
1249
|
+
0 14.0053 -13.9999 0 59.64 43.2505 Tm
|
|
1250
|
+
/Cs6 cs 0 0 0 scn
|
|
1251
|
+
-0.0002 Tc
|
|
1252
|
+
0.0008 Tw
|
|
1253
|
+
(Zuzahlungsbefreite Arzneimittel nach � 31 Abs. 3 Satz 4 SGB V)Tj
|
|
1254
|
+
/TT4 1 Tf
|
|
1255
|
+
0 9.0035 -9 0 117 176.4505 Tm
|
|
1256
|
+
0.0009 Tc
|
|
1257
|
+
0 Tw
|
|
1258
|
+
(PZN)Tj
|
|
1259
|
+
-14.7942 0 TD
|
|
1260
|
+
-0.0016 Tc
|
|
1261
|
+
[(Arzneimit)-3.7(t)-3.7(e)1.4(lname)]TJ
|
|
1262
|
+
59.8165 0 TD
|
|
1263
|
+
0.0016 Tc
|
|
1264
|
+
[(D)4(a)11.3(rrei)10.5(c)1.8(hu)4.6(n)11.3(g)-2(sf)6.2(orm)]TJ
|
|
1265
|
+
-39.9843 0 TD
|
|
1266
|
+
-0.0013 Tc
|
|
1267
|
+
[(He)8.4(rst)-10(e)8.4(l)-5.7(l)7.6(e)-4.9(r)]TJ
|
|
1268
|
+
52.2861 0 TD
|
|
1269
|
+
0.0001 Tc
|
|
1270
|
+
[(Apo)9.8(t)-8.6(h)9.8(e)-3.5(ke)9.8(nverka)9.8(ufspre)9.8(is)]TJ
|
|
1271
|
+
3.1321 -1.14 TD
|
|
1272
|
+
-0.0006 Tc
|
|
1273
|
+
0.0027 Tw
|
|
1274
|
+
[( in)-4.2(kl)8.3(.)-9.3(M)-0.6(w)21.8(S)0(t)]TJ
|
|
1275
|
+
ET
|
|
1276
|
+
129.3 42.531 1.98 751.68 re
|
|
1277
|
+
f
|
|
1278
|
+
BT
|
|
1279
|
+
0 9.0035 -9 0 117 519.6505 Tm
|
|
1280
|
+
-0.0017 Tc
|
|
1281
|
+
0 Tw
|
|
1282
|
+
(Packungs-)Tj
|
|
1283
|
+
1.0662 -1.14 TD
|
|
1284
|
+
-0.0022 Tc
|
|
1285
|
+
[(gr��)-4.4(e)]TJ
|
|
1286
|
+
-20.6119 1.14 TD
|
|
1287
|
+
0 Tc
|
|
1288
|
+
[(Wirkstoff)-8.7(\()-0.2(e)9.7(\))-5598(Wirkst�rke)]TJ
|
|
1289
|
+
ET
|
|
1290
|
+
q
|
|
1291
|
+
1 i
|
|
1292
|
+
108.9 440.091 9.96 53.46 re
|
|
1293
|
+
W n
|
|
1294
|
+
BT
|
|
1295
|
+
0 9.0035 -9 0 117 482.5705 Tm
|
|
1296
|
+
(\()Tj
|
|
1297
|
+
ET
|
|
1298
|
+
Q
|
|
1299
|
+
BT
|
|
1300
|
+
0 9.0035 -9 0 117 485.5705 Tm
|
|
1301
|
+
(n)Tj
|
|
1302
|
+
ET
|
|
1303
|
+
q
|
|
1304
|
+
1 i
|
|
1305
|
+
108.9 440.091 9.96 53.46 re
|
|
1306
|
+
W n
|
|
1307
|
+
BT
|
|
1308
|
+
0 9.0035 -9 0 117 490.5505 Tm
|
|
1309
|
+
(\))Tj
|
|
1310
|
+
ET
|
|
1311
|
+
Q
|
|
1312
|
+
BT
|
|
1313
|
+
/TT2 1 Tf
|
|
1314
|
+
0 14.0053 -13.9999 0 79.5 43.2505 Tm
|
|
1315
|
+
-0.0008 Tc
|
|
1316
|
+
(Produktstand)Tj
|
|
1317
|
+
0 -1.2129 TD
|
|
1318
|
+
-0.0001 Tc
|
|
1319
|
+
0.0007 Tw
|
|
1320
|
+
(sortiert nach Arzneimittelname)Tj
|
|
1321
|
+
7.2915 1.2129 TD
|
|
1322
|
+
0.0001 Tc
|
|
1323
|
+
0 Tw
|
|
1324
|
+
[(01)-94.9(.)-231.9(0)-0.7(8)-35(.)-0.5(2009)]TJ
|
|
1325
|
+
/TT4 1 Tf
|
|
1326
|
+
0 8.003 -7.9999 0 144.36 176.4505 Tm
|
|
1327
|
+
-0.0014 Tc
|
|
1328
|
+
(4000741)Tj
|
|
1329
|
+
-16.6438 0 TD
|
|
1330
|
+
-0.0006 Tc
|
|
1331
|
+
0.0002 Tw
|
|
1332
|
+
(ABSEAMED 10000I.E./1ML)Tj
|
|
1333
|
+
67.3249 0 TD
|
|
1334
|
+
-0.0008 Tc
|
|
1335
|
+
0 Tw
|
|
1336
|
+
[(Fertigspritzen)-12242.4(611,53)]TJ
|
|
1337
|
+
-45.0132 0 TD
|
|
1338
|
+
0.0045 Tc
|
|
1339
|
+
-0.0049 Tw
|
|
1340
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-23621.1(6)-1.6(X1)-1298.7(m)5.3(l)]TJ
|
|
1341
|
+
15.2268 0 TD
|
|
1342
|
+
-0.0006 Tc
|
|
1343
|
+
0.0077 Tw
|
|
1344
|
+
[(E)-8.4(p)0.8(o)8.3(e)0.8(t)-7.7(i)-3.3(n)8.3( alf)7.3(a)-8118.7(10000)-831.4(I.E.)]TJ
|
|
1345
|
+
ET
|
|
1346
|
+
169.56 42.531 0.48 748.26 re
|
|
1347
|
+
f
|
|
1348
|
+
BT
|
|
1349
|
+
0 8.003 -7.9999 0 178.32 176.4505 Tm
|
|
1350
|
+
-0.0014 Tc
|
|
1351
|
+
0 Tw
|
|
1352
|
+
(4000646)Tj
|
|
1353
|
+
-16.6438 0 TD
|
|
1354
|
+
-0.0006 Tc
|
|
1355
|
+
0.0002 Tw
|
|
1356
|
+
(ABSEAMED 1000I.E./0.5ML)Tj
|
|
1357
|
+
67.3249 0 TD
|
|
1358
|
+
0 Tw
|
|
1359
|
+
[(Fertigspritzen)-12519.7(64,20)]TJ
|
|
1360
|
+
-45.0132 0 TD
|
|
1361
|
+
0.0045 Tc
|
|
1362
|
+
-0.0049 Tw
|
|
1363
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-22781.4(6)5.9(X0)5.9(.)4.9(5)-1313.6(m)5.3(l)]TJ
|
|
1364
|
+
15.2268 0 TD
|
|
1365
|
+
-0.0005 Tc
|
|
1366
|
+
0.0076 Tw
|
|
1367
|
+
[(E)-8.3(p)0.9(o)8.4(e)0.9(t)-7.6(i)-3.2(n)8.4( alf)7.4(a)-8673.4(1000)-831.3(I.E.)]TJ
|
|
1368
|
+
ET
|
|
1369
|
+
203.46 42.531 0.54001 748.26 re
|
|
1370
|
+
f
|
|
1371
|
+
BT
|
|
1372
|
+
0 8.003 -7.9999 0 212.34 176.4505 Tm
|
|
1373
|
+
-0.0014 Tc
|
|
1374
|
+
0 Tw
|
|
1375
|
+
(4000652)Tj
|
|
1376
|
+
-16.6438 0 TD
|
|
1377
|
+
-0.0006 Tc
|
|
1378
|
+
0.0002 Tw
|
|
1379
|
+
(ABSEAMED 2000I.E./1ML)Tj
|
|
1380
|
+
67.3249 0 TD
|
|
1381
|
+
-0.0008 Tc
|
|
1382
|
+
0 Tw
|
|
1383
|
+
[(Fertigspritzen)-12242.4(119,04)]TJ
|
|
1384
|
+
-45.0132 0 TD
|
|
1385
|
+
0.0045 Tc
|
|
1386
|
+
-0.0049 Tw
|
|
1387
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-23621.1(6)-1.6(X1)-1298.7(m)5.3(l)]TJ
|
|
1388
|
+
15.2268 0 TD
|
|
1389
|
+
-0.0005 Tc
|
|
1390
|
+
0.0076 Tw
|
|
1391
|
+
[(E)-8.3(p)0.9(o)8.4(e)0.9(t)-7.6(i)-3.2(n)8.4( alf)7.4(a)-8673.4(2000)-831.3(I.E.)]TJ
|
|
1392
|
+
ET
|
|
1393
|
+
237.48 42.531 0.53999 748.26 re
|
|
1394
|
+
f
|
|
1395
|
+
BT
|
|
1396
|
+
0 8.003 -7.9999 0 246.36 176.4505 Tm
|
|
1397
|
+
-0.0014 Tc
|
|
1398
|
+
0 Tw
|
|
1399
|
+
(4000669)Tj
|
|
1400
|
+
-16.6438 0 TD
|
|
1401
|
+
-0.0006 Tc
|
|
1402
|
+
0.0002 Tw
|
|
1403
|
+
(ABSEAMED 3000I.E./0.3ML)Tj
|
|
1404
|
+
67.3249 0 TD
|
|
1405
|
+
-0.0008 Tc
|
|
1406
|
+
0 Tw
|
|
1407
|
+
[(Fertigspritzen)-12242.4(173,94)]TJ
|
|
1408
|
+
-45.0132 0 TD
|
|
1409
|
+
0.0045 Tc
|
|
1410
|
+
-0.0049 Tw
|
|
1411
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-22781.4(6)5.9(X0)5.9(.)4.9(3)-1313.6(m)5.3(l)]TJ
|
|
1412
|
+
15.2268 0 TD
|
|
1413
|
+
-0.0005 Tc
|
|
1414
|
+
0.0076 Tw
|
|
1415
|
+
[(E)-8.3(p)0.9(o)8.4(e)0.9(t)-7.6(i)-3.2(n)8.4( alf)7.4(a)-8673.4(3000)-831.3(I.E.)]TJ
|
|
1416
|
+
ET
|
|
1417
|
+
271.56 42.531 0.48001 748.26 re
|
|
1418
|
+
f
|
|
1419
|
+
BT
|
|
1420
|
+
0 8.003 -7.9999 0 280.32 176.4505 Tm
|
|
1421
|
+
-0.0014 Tc
|
|
1422
|
+
0 Tw
|
|
1423
|
+
(4000681)Tj
|
|
1424
|
+
-16.6438 0 TD
|
|
1425
|
+
-0.0006 Tc
|
|
1426
|
+
0.0002 Tw
|
|
1427
|
+
(ABSEAMED 4000I.E./0.4ML)Tj
|
|
1428
|
+
67.3249 0 TD
|
|
1429
|
+
-0.0008 Tc
|
|
1430
|
+
0 Tw
|
|
1431
|
+
[(Fertigspritzen)-12242.4(228,83)]TJ
|
|
1432
|
+
-45.0132 0 TD
|
|
1433
|
+
0.0045 Tc
|
|
1434
|
+
-0.0049 Tw
|
|
1435
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-22781.4(6)5.9(X0)5.9(.)4.9(4)-1313.6(m)5.3(l)]TJ
|
|
1436
|
+
15.2268 0 TD
|
|
1437
|
+
-0.0005 Tc
|
|
1438
|
+
0.0076 Tw
|
|
1439
|
+
[(E)-8.3(p)0.9(o)8.4(e)0.9(t)-7.6(i)-3.2(n)8.4( alf)7.4(a)-8673.4(4000)-831.3(I.E.)]TJ
|
|
1440
|
+
ET
|
|
1441
|
+
305.46 42.531 0.53998 748.26 re
|
|
1442
|
+
f
|
|
1443
|
+
BT
|
|
1444
|
+
0 8.003 -7.9999 0 314.34 176.4505 Tm
|
|
1445
|
+
-0.0014 Tc
|
|
1446
|
+
0 Tw
|
|
1447
|
+
(4000698)Tj
|
|
1448
|
+
-16.6438 0 TD
|
|
1449
|
+
-0.0006 Tc
|
|
1450
|
+
0.0002 Tw
|
|
1451
|
+
(ABSEAMED 5000I.E./0.5ML)Tj
|
|
1452
|
+
67.3249 0 TD
|
|
1453
|
+
-0.0008 Tc
|
|
1454
|
+
0 Tw
|
|
1455
|
+
[(Fertigspritzen)-12242.4(283,70)]TJ
|
|
1456
|
+
-45.0132 0 TD
|
|
1457
|
+
0.0045 Tc
|
|
1458
|
+
-0.0049 Tw
|
|
1459
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-22781.4(6)5.9(X0)5.9(.)4.9(5)-1313.6(m)5.3(l)]TJ
|
|
1460
|
+
15.2268 0 TD
|
|
1461
|
+
-0.0005 Tc
|
|
1462
|
+
0.0076 Tw
|
|
1463
|
+
[(E)-8.3(p)0.9(o)8.4(e)0.9(t)-7.6(i)-3.2(n)8.4( alf)7.4(a)-8673.4(5000)-831.3(I.E.)]TJ
|
|
1464
|
+
ET
|
|
1465
|
+
339.48 42.531 0.54001 748.26 re
|
|
1466
|
+
f
|
|
1467
|
+
BT
|
|
1468
|
+
0 8.003 -7.9999 0 348.36 176.4505 Tm
|
|
1469
|
+
-0.0014 Tc
|
|
1470
|
+
0 Tw
|
|
1471
|
+
(4000729)Tj
|
|
1472
|
+
-16.6438 0 TD
|
|
1473
|
+
-0.0006 Tc
|
|
1474
|
+
0.0002 Tw
|
|
1475
|
+
(ABSEAMED 6000I.E./0.6ML)Tj
|
|
1476
|
+
67.3249 0 TD
|
|
1477
|
+
-0.0008 Tc
|
|
1478
|
+
0 Tw
|
|
1479
|
+
[(Fertigspritzen)-12242.4(338,57)]TJ
|
|
1480
|
+
-45.0132 0 TD
|
|
1481
|
+
0.0045 Tc
|
|
1482
|
+
-0.0049 Tw
|
|
1483
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-22781.4(6)5.9(X0)5.9(.)4.9(6)-1313.6(m)5.3(l)]TJ
|
|
1484
|
+
15.2268 0 TD
|
|
1485
|
+
-0.0005 Tc
|
|
1486
|
+
0.0076 Tw
|
|
1487
|
+
[(E)-8.3(p)0.9(o)8.4(e)0.9(t)-7.6(i)-3.2(n)8.4( alf)7.4(a)-8673.4(6000)-831.3(I.E.)]TJ
|
|
1488
|
+
ET
|
|
1489
|
+
373.56 42.531 0.47998 748.26 re
|
|
1490
|
+
f
|
|
1491
|
+
BT
|
|
1492
|
+
0 8.003 -7.9999 0 382.32 176.4505 Tm
|
|
1493
|
+
-0.0014 Tc
|
|
1494
|
+
0 Tw
|
|
1495
|
+
(4000735)Tj
|
|
1496
|
+
-16.6438 0 TD
|
|
1497
|
+
-0.0006 Tc
|
|
1498
|
+
0.0002 Tw
|
|
1499
|
+
(ABSEAMED 8000I.E./0.8ML)Tj
|
|
1500
|
+
67.3249 0 TD
|
|
1501
|
+
-0.0008 Tc
|
|
1502
|
+
0 Tw
|
|
1503
|
+
[(Fertigspritzen)-12242.4(448,34)]TJ
|
|
1504
|
+
-45.0132 0 TD
|
|
1505
|
+
0.0045 Tc
|
|
1506
|
+
-0.0049 Tw
|
|
1507
|
+
[(M)12.8(E)-3.3(D)14.4(I)-2.6(C)6.9(E)4.2( AR)6.9(Z)15.6(N)6.9(.G)17.6(MB)11.7(H&)11.7(CO)17.6(.K)11.7(G)-22781.4(6)5.9(X0)5.9(.)4.9(8)-1313.6(m)5.3(l)]TJ
|
|
1508
|
+
15.2268 0 TD
|
|
1509
|
+
-0.0005 Tc
|
|
1510
|
+
0.0076 Tw
|
|
1511
|
+
[(E)-8.3(p)0.9(o)8.4(e)0.9(t)-7.6(i)-3.2(n)8.4( alf)7.4(a)-8673.4(8000)-831.3(I.E.)]TJ
|
|
1512
|
+
ET
|
|
1513
|
+
407.46 42.531 0.54001 748.26 re
|
|
1514
|
+
f
|
|
1515
|
+
BT
|
|
1516
|
+
0 8.003 -7.9999 0 416.34 176.4505 Tm
|
|
1517
|
+
-0.0014 Tc
|
|
1518
|
+
0 Tw
|
|
1519
|
+
(3867219)Tj
|
|
1520
|
+
-16.6438 0 TD
|
|
1521
|
+
-0.0016 Tc
|
|
1522
|
+
0.0012 Tw
|
|
1523
|
+
(ACC 200)Tj
|
|
1524
|
+
67.3249 0 TD
|
|
1525
|
+
-0.0008 Tc
|
|
1526
|
+
0 Tw
|
|
1527
|
+
[(Brausetabletten)-11575.1(12,74)]TJ
|
|
1528
|
+
-45.0132 0 TD
|
|
1529
|
+
0.0003 Tc
|
|
1530
|
+
0.0068 Tw
|
|
1531
|
+
[(H)10.2(E)-7.5(XAL)9.2( AG)]TJ
|
|
1532
|
+
38.2882 0 TD
|
|
1533
|
+
-0.0006 Tc
|
|
1534
|
+
0 Tw
|
|
1535
|
+
[(50)-1333.7(St)]TJ
|
|
1536
|
+
-23.0614 0 TD
|
|
1537
|
+
-0.0021 Tc
|
|
1538
|
+
[(A)-9.9(c)3.1(ety)10.6(l)-4.9(c)-11.9(y)10.6(st)-9.2(e)6.8(i)-4.8(n)-8690(2)-8.2(00)-825.4(mg)]TJ
|
|
1539
|
+
ET
|
|
1540
|
+
441.48 42.531 0.54001 748.26 re
|
|
1541
|
+
f
|
|
1542
|
+
BT
|
|
1543
|
+
0 8.003 -7.9999 0 450.36 176.4505 Tm
|
|
1544
|
+
-0.0014 Tc
|
|
1545
|
+
(3867225)Tj
|
|
1546
|
+
-16.6438 0 TD
|
|
1547
|
+
-0.0016 Tc
|
|
1548
|
+
0.0012 Tw
|
|
1549
|
+
(ACC 200)Tj
|
|
1550
|
+
67.3249 0 TD
|
|
1551
|
+
-0.0008 Tc
|
|
1552
|
+
0 Tw
|
|
1553
|
+
[(Brausetabletten)-11575.1(15,42)]TJ
|
|
1554
|
+
-45.0132 0 TD
|
|
1555
|
+
0.0003 Tc
|
|
1556
|
+
0.0068 Tw
|
|
1557
|
+
[(H)10.2(E)-7.5(XAL)9.2( AG)]TJ
|
|
1558
|
+
37.7335 0 TD
|
|
1559
|
+
-0.0007 Tc
|
|
1560
|
+
0 Tw
|
|
1561
|
+
[(100)-1333.8(St)]TJ
|
|
1562
|
+
-22.5066 0 TD
|
|
1563
|
+
-0.0021 Tc
|
|
1564
|
+
[(A)-9.9(c)3.1(ety)10.6(l)-4.9(c)-11.9(y)10.6(st)-9.2(e)6.8(i)-4.8(n)-8690(2)-8.2(00)-825.4(mg)]TJ
|
|
1565
|
+
ET
|
|
1566
|
+
475.56 42.531 0.47998 748.26 re
|
|
1567
|
+
f
|
|
1568
|
+
BT
|
|
1569
|
+
0 8.003 -7.9999 0 484.32 176.4505 Tm
|
|
1570
|
+
-0.0014 Tc
|
|
1571
|
+
(4789763)Tj
|
|
1572
|
+
-16.6438 0 TD
|
|
1573
|
+
-0.0016 Tc
|
|
1574
|
+
0.0012 Tw
|
|
1575
|
+
(ACC 200)Tj
|
|
1576
|
+
67.3249 0 TD
|
|
1577
|
+
-0.0008 Tc
|
|
1578
|
+
0 Tw
|
|
1579
|
+
[(Brausetabletten)-11575.1(11,01)]TJ
|
|
1580
|
+
-45.0132 0 TD
|
|
1581
|
+
0.0003 Tc
|
|
1582
|
+
0.0068 Tw
|
|
1583
|
+
[(H)10.2(E)-7.5(XAL)9.2( AG)]TJ
|
|
1584
|
+
38.2882 0 TD
|
|
1585
|
+
-0.0006 Tc
|
|
1586
|
+
0 Tw
|
|
1587
|
+
[(20)-1333.7(St)]TJ
|
|
1588
|
+
-23.0614 0 TD
|
|
1589
|
+
-0.0021 Tc
|
|
1590
|
+
[(A)-9.9(c)3.1(ety)10.6(l)-4.9(c)-11.9(y)10.6(st)-9.2(e)6.8(i)-4.8(n)-8690(2)-8.2(00)-825.4(mg)]TJ
|
|
1591
|
+
ET
|
|
1592
|
+
509.46 42.531 0.53998 748.26 re
|
|
1593
|
+
f
|
|
1594
|
+
BT
|
|
1595
|
+
0 8.003 -7.9999 0 548.8199 376.6105 Tm
|
|
1596
|
+
-0.0007 Tc
|
|
1597
|
+
-0.0072 Tw
|
|
1598
|
+
[(Seite 1)-6.8( v)-10.5(o)0.7(n)8.2( )-15(10)8.2(83)]TJ
|
|
1599
|
+
ET
|
|
1600
|
+
EOS
|
|
1601
|
+
page = PageLeaf.new
|
|
1602
|
+
page.attributes.store :rotate, '90'
|
|
1603
|
+
page.resources = Resource.new
|
|
1604
|
+
handler = SimpleHandler.new
|
|
1605
|
+
page.contents = [stream]
|
|
1606
|
+
page.text(handler)
|
|
1607
|
+
expected = <<-EOS
|
|
1608
|
+
Zuzahlungsbefreite Arzneimittel nach \247 31 Abs. 3 Satz 4 SGB V
|
|
1609
|
+
Produktstand 01.08.2009
|
|
1610
|
+
sortiert nach Arzneimittelname
|
|
1611
|
+
Arzneimittelname PZN Hersteller Wirkstoff(e) Wirkst�rke (n) Packungs- Darreichungsform Apothekenverkaufspreis
|
|
1612
|
+
gr��e inkl.MwSt
|
|
1613
|
+
ABSEAMED 10000I.E./1ML 4000741 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 10000 I.E.6X1 ml Fertigspritzen 611,53
|
|
1614
|
+
ABSEAMED 1000I.E./0.5ML 4000646 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 1000 6I.E.X0.5 ml Fertigspritzen 64,20
|
|
1615
|
+
ABSEAMED 2000I.E./1ML 4000652 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 2000 I.E.6X1 ml Fertigspritzen 119,04
|
|
1616
|
+
ABSEAMED 3000I.E./0.3ML 4000669 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 3000 6I.E.X0.3 ml Fertigspritzen 173,94
|
|
1617
|
+
ABSEAMED 4000I.E./0.4ML 4000681 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 4000 6I.E.X0.4 ml Fertigspritzen 228,83
|
|
1618
|
+
ABSEAMED 5000I.E./0.5ML 4000698 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 5000 6I.E.X0.5 ml Fertigspritzen 283,70
|
|
1619
|
+
ABSEAMED 6000I.E./0.6ML 4000729 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 6000 6I.E.X0.6 ml Fertigspritzen 338,57
|
|
1620
|
+
ABSEAMED 8000I.E./0.8ML 4000735 MEDICE ARZN.GMBH&CO.KG Epoetin alfa 8000 6I.E.X0.8 ml Fertigspritzen 448,34
|
|
1621
|
+
ACC 200 3867219 HEXAL AG Acetylcystein 200 mg 50 St Brausetabletten 12,74
|
|
1622
|
+
ACC 200 3867225 HEXAL AG Acetylcystein 200 mg 100 St Brausetabletten 15,42
|
|
1623
|
+
ACC 200 4789763 HEXAL AG Acetylcystein 200 mg 20 St Brausetabletten 11,01
|
|
1624
|
+
Seite 1 von 1083
|
|
1625
|
+
EOS
|
|
1626
|
+
assert_equal(expected.strip, handler.out.strip)
|
|
1627
|
+
end
|
|
1628
|
+
def test_text_kerning_bug
|
|
1629
|
+
stream = Stream.new
|
|
1630
|
+
path = File.expand_path('data/stream_kerning_bug.txt',
|
|
1631
|
+
File.dirname(__FILE__))
|
|
1632
|
+
stream.decoded_stream = File.read path
|
|
1633
|
+
page = PageLeaf.new
|
|
1634
|
+
page.attributes.store :rotate, '90'
|
|
1635
|
+
page.resources = Resource.new
|
|
1636
|
+
handler = SimpleHandler.new
|
|
1637
|
+
page.contents = [stream]
|
|
1638
|
+
page.text(handler)
|
|
1639
|
+
expected = "RATIOPHARM GMBH 20 St"
|
|
1640
|
+
assert_equal(expected.strip, handler.out.strip)
|
|
1641
|
+
end
|
|
1642
|
+
def test_text_kerning_bug2
|
|
1643
|
+
stream = Stream.new
|
|
1644
|
+
path = File.expand_path('data/stream_kerning_bug2.txt',
|
|
1645
|
+
File.dirname(__FILE__))
|
|
1646
|
+
stream.decoded_stream = File.read path
|
|
1647
|
+
page = PageLeaf.new
|
|
1648
|
+
page.attributes.store :rotate, '90'
|
|
1649
|
+
page.resources = Resource.new
|
|
1650
|
+
handler = SimpleHandler.new
|
|
1651
|
+
page.contents = [stream]
|
|
1652
|
+
page.text(handler)
|
|
1653
|
+
expected = "HEUMANN PH GMBH&CO. KG 20 St"
|
|
1654
|
+
assert_equal(expected.strip, handler.out.strip)
|
|
1655
|
+
end
|
|
1656
|
+
=begin
|
|
1657
|
+
def test_text_space_bug2
|
|
1658
|
+
stream = Stream.new
|
|
1659
|
+
path = File.expand_path('data/space_bug_stream2.txt',
|
|
1660
|
+
File.dirname(__FILE__))
|
|
1661
|
+
fontsrc15 = <<-EOS
|
|
1662
|
+
327 0 obj
|
|
1663
|
+
EOS
|
|
1664
|
+
font15 = Font.new(fontsrc15)
|
|
1665
|
+
stream.decoded_stream = File.read path
|
|
1666
|
+
page = PageLeaf.new
|
|
1667
|
+
page.resources = resource = Resource.new
|
|
1668
|
+
resource.instance_variable_get('@fonts').store(:r15, font15)
|
|
1669
|
+
handler = SimpleHandler.new
|
|
1670
|
+
page.contents = [stream]
|
|
1671
|
+
page.text(handler)
|
|
1672
|
+
expected = "Inhalt / Table des mati\303\250res"
|
|
1673
|
+
assert_equal(expected.strip, handler.out.strip[0,28])
|
|
1674
|
+
expected = '10 mg, 20 mg und 40 mg'
|
|
1675
|
+
assert_equal(expected.strip, handler.out.strip[346,22])
|
|
1676
|
+
end
|
|
1677
|
+
=end
|
|
1678
|
+
end
|
|
1679
|
+
class TestEncoding < Test::Unit::TestCase
|
|
1680
|
+
def setup
|
|
1681
|
+
src = <<-EOS
|
|
1682
|
+
252 0 obj
|
|
1683
|
+
<<
|
|
1684
|
+
/Type /Encoding
|
|
1685
|
+
/Differences [ 1 /space /beta /alpha ]
|
|
1686
|
+
>>
|
|
1687
|
+
endobj
|
|
1688
|
+
EOS
|
|
1689
|
+
@encoding = Rpdf2txt::Encoding.new(src)
|
|
1690
|
+
end
|
|
1691
|
+
def test_differences
|
|
1692
|
+
expected = {
|
|
1693
|
+
1 => 'space',
|
|
1694
|
+
2 => 'beta',
|
|
1695
|
+
3 => 'alpha',
|
|
1696
|
+
}
|
|
1697
|
+
assert_equal(expected, @encoding.differences)
|
|
1698
|
+
end
|
|
1699
|
+
def test_convert_symbol
|
|
1700
|
+
txt = "\003"
|
|
1701
|
+
assert_equal("a", @encoding.convert_symbol(txt))
|
|
1702
|
+
assert_equal("\003", txt)
|
|
1703
|
+
end
|
|
1704
|
+
end
|
|
1705
|
+
class TestImage < Test::Unit::TestCase
|
|
1706
|
+
def test_png
|
|
1707
|
+
path = File.expand_path('data/png.pdfobj', File.dirname(__FILE__))
|
|
1708
|
+
src = File.read(path)
|
|
1709
|
+
obj = Image.new(src)
|
|
1710
|
+
assert_nothing_raised { obj.image }
|
|
1711
|
+
path = File.expand_path('data/logo.png', File.dirname(__FILE__))
|
|
1712
|
+
good, = Magick::Image.read path
|
|
1713
|
+
assert_equal(good, obj.image)
|
|
1714
|
+
end
|
|
1715
|
+
def test_indexed
|
|
1716
|
+
path = File.expand_path('data/index.pdfobj', File.dirname(__FILE__))
|
|
1717
|
+
src = File.read(path)
|
|
1718
|
+
index = Stream.new(src)
|
|
1719
|
+
path = File.expand_path('data/indexed.pdfobj', File.dirname(__FILE__))
|
|
1720
|
+
src = File.read(path)
|
|
1721
|
+
obj = Image.new(src)
|
|
1722
|
+
obj.build_tree(51 => index)
|
|
1723
|
+
assert_nothing_raised { obj.image }
|
|
1724
|
+
path = File.expand_path('data/pdf_50.png', File.dirname(__FILE__))
|
|
1725
|
+
good, = Magick::Image.read path
|
|
1726
|
+
assert_equal(good, obj.image)
|
|
1727
|
+
end
|
|
1728
|
+
def test_indexed_2bit
|
|
1729
|
+
path = File.expand_path('data/index_2bit.pdfobj', File.dirname(__FILE__))
|
|
1730
|
+
src = File.read(path)
|
|
1731
|
+
index = Stream.new(src)
|
|
1732
|
+
path = File.expand_path('data/indexed_2bit.pdfobj', File.dirname(__FILE__))
|
|
1733
|
+
src = File.read(path)
|
|
1734
|
+
obj = Image.new(src)
|
|
1735
|
+
obj.build_tree(21 => index)
|
|
1736
|
+
assert_nothing_raised { obj.image }
|
|
1737
|
+
path = File.expand_path('data/pdf_20.png', File.dirname(__FILE__))
|
|
1738
|
+
good, = Magick::Image.read path
|
|
1739
|
+
assert_equal(good, obj.image)
|
|
1740
|
+
end
|
|
1741
|
+
def test_indexed_masked
|
|
1742
|
+
path = File.expand_path('data/index_masked.pdfobj', File.dirname(__FILE__))
|
|
1743
|
+
src = File.read(path)
|
|
1744
|
+
index = Stream.new(src)
|
|
1745
|
+
path = File.expand_path('data/indexed_masked.pdfobj', File.dirname(__FILE__))
|
|
1746
|
+
src = File.read(path)
|
|
1747
|
+
obj = Image.new(src)
|
|
1748
|
+
obj.build_tree(21 => index)
|
|
1749
|
+
assert_nothing_raised { obj.image }
|
|
1750
|
+
path = File.expand_path('data/pdf_21.png', File.dirname(__FILE__))
|
|
1751
|
+
good, = Magick::Image.read path
|
|
1752
|
+
assert_equal(good, obj.image)
|
|
1753
|
+
end
|
|
1754
|
+
def test_lzw_decode ## from the PDF-Manual
|
|
1755
|
+
data = "\x80\x0B\x60\x50\x22\x0C\x0C\x85\x01"
|
|
1756
|
+
stream = Stream.new(data)
|
|
1757
|
+
expected = "-----A---B"
|
|
1758
|
+
assert_equal(expected, stream.lzw_decode(data))
|
|
1759
|
+
end
|
|
1760
|
+
def test_lzw_image
|
|
1761
|
+
path = File.expand_path('data/lzw_index.pdfobj', File.dirname(__FILE__))
|
|
1762
|
+
src = File.read(path)
|
|
1763
|
+
index = Stream.new(src)
|
|
1764
|
+
path = File.expand_path('data/lzw.pdfobj', File.dirname(__FILE__))
|
|
1765
|
+
src = File.read(path)
|
|
1766
|
+
obj = Image.new(src)
|
|
1767
|
+
obj.build_tree(21 => index)
|
|
1768
|
+
assert_nothing_raised { obj.image }
|
|
1769
|
+
path = File.expand_path('data/pdf_22.png', File.dirname(__FILE__))
|
|
1770
|
+
good, = Magick::Image.read path
|
|
1771
|
+
assert_equal(good, obj.image)
|
|
1772
|
+
end
|
|
1773
|
+
end
|
|
1774
|
+
class TestInlineImage < Test::Unit::TestCase
|
|
1775
|
+
def test_inline_img
|
|
1776
|
+
attrs = <<-EOS
|
|
1777
|
+
/W 113
|
|
1778
|
+
/CS /DeviceGray
|
|
1779
|
+
/BPC 8
|
|
1780
|
+
/DP << /Predictor 15
|
|
1781
|
+
/Columns 113
|
|
1782
|
+
>>
|
|
1783
|
+
/F /Fl
|
|
1784
|
+
/H 1
|
|
1785
|
+
|
|
1786
|
+
EOS
|
|
1787
|
+
data = "x\234cd\2407\000\000\000\344\000\002"
|
|
1788
|
+
obj = InlineImage.new(attrs, data)
|
|
1789
|
+
assert_nothing_raised { obj.image }
|
|
1790
|
+
path = File.expand_path('data/inline.png', File.dirname(__FILE__))
|
|
1791
|
+
good = Magick::Image.read path
|
|
1792
|
+
tmp_path = Tempfile.new('test').path + '.png'
|
|
1793
|
+
obj.image.write tmp_path
|
|
1794
|
+
tmp = Magick::Image.read tmp_path
|
|
1795
|
+
assert_equal(good, tmp)
|
|
1796
|
+
rescue StandardError => e
|
|
1797
|
+
p e
|
|
1798
|
+
ensure
|
|
1799
|
+
File.delete tmp_path if File.exist? tmp_path
|
|
1800
|
+
end
|
|
1801
|
+
end
|
|
1802
|
+
end
|