command_wrap 0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of command_wrap might be problematic. Click here for more details.
- data/README +18 -0
- data/bin/CutyCapt +0 -0
- data/bin/DocumentConverter.py +231 -0
- data/bin/openoffice_server.rb +4 -0
- data/bin/wkhtmltopdf +0 -0
- data/lib/command_wrap.rb +123 -0
- data/lib/command_wrap/config.rb +34 -0
- data/lib/command_wrap/config/open_office.rb +79 -0
- data/lib/command_wrap/config/xvfb.rb +27 -0
- data/lib/command_wrap/image.rb +38 -0
- data/lib/command_wrap/open_office.rb +40 -0
- data/lib/command_wrap/open_office/server.rb +29 -0
- data/lib/command_wrap/pdf.rb +47 -0
- data/tests/helpers/2pages.pdf +0 -0
- data/tests/helpers/error.mpg +0 -0
- data/tests/helpers/img150x200.jpg +0 -0
- data/tests/helpers/pdf2.pdf +0 -0
- data/tests/helpers/pdf3.pdf +0 -0
- data/tests/helpers/scale.jpg +0 -0
- data/tests/helpers/test.htm +1 -0
- data/tests/helpers/test.html +1 -0
- data/tests/helpers/test.odt +0 -0
- data/tests/helpers/test.txt +1 -0
- data/tests/test_helper.rb +3 -0
- data/tests/unit/command_wrap_test.rb +104 -0
- data/tests/unit/config_open_office_test.rb +108 -0
- data/tests/unit/config_test.rb +36 -0
- data/tests/unit/config_xvfb_test.rb +34 -0
- data/tests/unit/image_test.rb +53 -0
- data/tests/unit/open_office_server_test.rb +11 -0
- data/tests/unit/open_office_test.rb +27 -0
- data/tests/unit/pdf_test.rb +74 -0
- metadata +120 -0
data/README
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
A set of utility classes to extract meta data from different file types
|
2
|
+
|
3
|
+
INSTALL
|
4
|
+
-------
|
5
|
+
|
6
|
+
gem install CommandWrap
|
7
|
+
|
8
|
+
REQUIREMENTS
|
9
|
+
------------
|
10
|
+
|
11
|
+
For full functionality the following programs must be installed:
|
12
|
+
- openoffice
|
13
|
+
- openoffice python bindings
|
14
|
+
- pdftk
|
15
|
+
- zip
|
16
|
+
- imagemagick
|
17
|
+
- Xvfb
|
18
|
+
- libqt-webkit, libqt4-svg
|
data/bin/CutyCapt
ADDED
Binary file
|
@@ -0,0 +1,231 @@
|
|
1
|
+
#
|
2
|
+
# PyODConverter (Python OpenDocument Converter) v1.1 - 2009-11-14
|
3
|
+
#
|
4
|
+
# This script converts a document from one office format to another by
|
5
|
+
# connecting to an OpenOffice.org instance via Python-UNO bridge.
|
6
|
+
#
|
7
|
+
# Copyright (C) 2008-2009 Mirko Nasato <mirko@artofsolving.com>
|
8
|
+
# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl-2.1.html
|
9
|
+
# - or any later version.
|
10
|
+
#
|
11
|
+
DEFAULT_OPENOFFICE_PORT = 8100
|
12
|
+
|
13
|
+
import uno
|
14
|
+
from os.path import abspath, isfile, splitext
|
15
|
+
from com.sun.star.beans import PropertyValue
|
16
|
+
from com.sun.star.task import ErrorCodeIOException
|
17
|
+
from com.sun.star.connection import NoConnectException
|
18
|
+
|
19
|
+
FAMILY_TEXT = "Text"
|
20
|
+
FAMILY_WEB = "Web"
|
21
|
+
FAMILY_SPREADSHEET = "Spreadsheet"
|
22
|
+
FAMILY_PRESENTATION = "Presentation"
|
23
|
+
FAMILY_DRAWING = "Drawing"
|
24
|
+
|
25
|
+
#---------------------#
|
26
|
+
# Configuration Start #
|
27
|
+
#---------------------#
|
28
|
+
|
29
|
+
# see http://wiki.services.openoffice.org/wiki/Framework/Article/Filter
|
30
|
+
|
31
|
+
# most formats are auto-detected; only those requiring options are defined here
|
32
|
+
IMPORT_FILTER_MAP = {
|
33
|
+
"txt": {
|
34
|
+
"FilterName": "Text (encoded)",
|
35
|
+
"FilterOptions": "utf8"
|
36
|
+
},
|
37
|
+
"csv": {
|
38
|
+
"FilterName": "Text - txt - csv (StarCalc)",
|
39
|
+
"FilterOptions": "44,34,0"
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
EXPORT_FILTER_MAP = {
|
44
|
+
"pdf": {
|
45
|
+
FAMILY_TEXT: { "FilterName": "writer_pdf_Export" },
|
46
|
+
FAMILY_WEB: { "FilterName": "writer_web_pdf_Export" },
|
47
|
+
FAMILY_SPREADSHEET: { "FilterName": "calc_pdf_Export" },
|
48
|
+
FAMILY_PRESENTATION: { "FilterName": "impress_pdf_Export" },
|
49
|
+
FAMILY_DRAWING: { "FilterName": "draw_pdf_Export" }
|
50
|
+
},
|
51
|
+
"html": {
|
52
|
+
FAMILY_TEXT: { "FilterName": "HTML (StarWriter)" },
|
53
|
+
FAMILY_SPREADSHEET: { "FilterName": "HTML (StarCalc)" },
|
54
|
+
FAMILY_PRESENTATION: { "FilterName": "impress_html_Export" }
|
55
|
+
},
|
56
|
+
"odt": {
|
57
|
+
FAMILY_TEXT: { "FilterName": "writer8" },
|
58
|
+
FAMILY_WEB: { "FilterName": "writerweb8_writer" }
|
59
|
+
},
|
60
|
+
"doc": {
|
61
|
+
FAMILY_TEXT: { "FilterName": "MS Word 97" }
|
62
|
+
},
|
63
|
+
"rtf": {
|
64
|
+
FAMILY_TEXT: { "FilterName": "Rich Text Format" }
|
65
|
+
},
|
66
|
+
"txt": {
|
67
|
+
FAMILY_TEXT: {
|
68
|
+
"FilterName": "Text",
|
69
|
+
"FilterOptions": "utf8"
|
70
|
+
}
|
71
|
+
},
|
72
|
+
"ods": {
|
73
|
+
FAMILY_SPREADSHEET: { "FilterName": "calc8" }
|
74
|
+
},
|
75
|
+
"xls": {
|
76
|
+
FAMILY_SPREADSHEET: { "FilterName": "MS Excel 97" }
|
77
|
+
},
|
78
|
+
"csv": {
|
79
|
+
FAMILY_SPREADSHEET: {
|
80
|
+
"FilterName": "Text - txt - csv (StarCalc)",
|
81
|
+
"FilterOptions": "44,34,0"
|
82
|
+
}
|
83
|
+
},
|
84
|
+
"odp": {
|
85
|
+
FAMILY_PRESENTATION: { "FilterName": "impress8" }
|
86
|
+
},
|
87
|
+
"ppt": {
|
88
|
+
FAMILY_PRESENTATION: { "FilterName": "MS PowerPoint 97" }
|
89
|
+
},
|
90
|
+
"swf": {
|
91
|
+
FAMILY_DRAWING: { "FilterName": "draw_flash_Export" },
|
92
|
+
FAMILY_PRESENTATION: { "FilterName": "impress_flash_Export" }
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
PAGE_STYLE_OVERRIDE_PROPERTIES = {
|
97
|
+
FAMILY_SPREADSHEET: {
|
98
|
+
#--- Scale options: uncomment 1 of the 3 ---
|
99
|
+
# a) 'Reduce / enlarge printout': 'Scaling factor'
|
100
|
+
"PageScale": 100,
|
101
|
+
# b) 'Fit print range(s) to width / height': 'Width in pages' and 'Height in pages'
|
102
|
+
#"ScaleToPagesX": 1, "ScaleToPagesY": 1000,
|
103
|
+
# c) 'Fit print range(s) on number of pages': 'Fit print range(s) on number of pages'
|
104
|
+
#"ScaleToPages": 1,
|
105
|
+
"PrintGrid": False
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
#-------------------#
|
110
|
+
# Configuration End #
|
111
|
+
#-------------------#
|
112
|
+
|
113
|
+
class DocumentConversionException(Exception):
|
114
|
+
|
115
|
+
def __init__(self, message):
|
116
|
+
self.message = message
|
117
|
+
|
118
|
+
def __str__(self):
|
119
|
+
return self.message
|
120
|
+
|
121
|
+
|
122
|
+
class DocumentConverter:
|
123
|
+
|
124
|
+
def __init__(self, port=DEFAULT_OPENOFFICE_PORT):
|
125
|
+
localContext = uno.getComponentContext()
|
126
|
+
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
|
127
|
+
try:
|
128
|
+
context = resolver.resolve("uno:socket,host=localhost,port=%s;urp;StarOffice.ComponentContext" % port)
|
129
|
+
except NoConnectException:
|
130
|
+
raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port
|
131
|
+
self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)
|
132
|
+
|
133
|
+
def convert(self, inputFile, outputFile):
|
134
|
+
|
135
|
+
inputUrl = self._toFileUrl(inputFile)
|
136
|
+
outputUrl = self._toFileUrl(outputFile)
|
137
|
+
|
138
|
+
loadProperties = { "Hidden": True }
|
139
|
+
inputExt = self._getFileExt(inputFile)
|
140
|
+
if IMPORT_FILTER_MAP.has_key(inputExt):
|
141
|
+
loadProperties.update(IMPORT_FILTER_MAP[inputExt])
|
142
|
+
|
143
|
+
document = self.desktop.loadComponentFromURL(inputUrl, "_blank", 0, self._toProperties(loadProperties))
|
144
|
+
try:
|
145
|
+
document.refresh()
|
146
|
+
except AttributeError:
|
147
|
+
pass
|
148
|
+
|
149
|
+
family = self._detectFamily(document)
|
150
|
+
self._overridePageStyleProperties(document, family)
|
151
|
+
|
152
|
+
outputExt = self._getFileExt(outputFile)
|
153
|
+
storeProperties = self._getStoreProperties(document, outputExt)
|
154
|
+
|
155
|
+
try:
|
156
|
+
document.storeToURL(outputUrl, self._toProperties(storeProperties))
|
157
|
+
finally:
|
158
|
+
document.close(True)
|
159
|
+
|
160
|
+
def _overridePageStyleProperties(self, document, family):
|
161
|
+
if PAGE_STYLE_OVERRIDE_PROPERTIES.has_key(family):
|
162
|
+
properties = PAGE_STYLE_OVERRIDE_PROPERTIES[family]
|
163
|
+
pageStyles = document.getStyleFamilies().getByName('PageStyles')
|
164
|
+
for styleName in pageStyles.getElementNames():
|
165
|
+
pageStyle = pageStyles.getByName(styleName)
|
166
|
+
for name, value in properties.items():
|
167
|
+
pageStyle.setPropertyValue(name, value)
|
168
|
+
|
169
|
+
def _getStoreProperties(self, document, outputExt):
|
170
|
+
family = self._detectFamily(document)
|
171
|
+
try:
|
172
|
+
propertiesByFamily = EXPORT_FILTER_MAP[outputExt]
|
173
|
+
except KeyError:
|
174
|
+
raise DocumentConversionException, "unknown output format: '%s'" % outputExt
|
175
|
+
try:
|
176
|
+
return propertiesByFamily[family]
|
177
|
+
except KeyError:
|
178
|
+
raise DocumentConversionException, "unsupported conversion: from '%s' to '%s'" % (family, outputExt)
|
179
|
+
|
180
|
+
def _detectFamily(self, document):
|
181
|
+
if document.supportsService("com.sun.star.text.WebDocument"):
|
182
|
+
return FAMILY_WEB
|
183
|
+
if document.supportsService("com.sun.star.text.GenericTextDocument"):
|
184
|
+
# must be TextDocument or GlobalDocument
|
185
|
+
return FAMILY_TEXT
|
186
|
+
if document.supportsService("com.sun.star.sheet.SpreadsheetDocument"):
|
187
|
+
return FAMILY_SPREADSHEET
|
188
|
+
if document.supportsService("com.sun.star.presentation.PresentationDocument"):
|
189
|
+
return FAMILY_PRESENTATION
|
190
|
+
if document.supportsService("com.sun.star.drawing.DrawingDocument"):
|
191
|
+
return FAMILY_DRAWING
|
192
|
+
raise DocumentConversionException, "unknown document family: %s" % document
|
193
|
+
|
194
|
+
def _getFileExt(self, path):
|
195
|
+
ext = splitext(path)[1]
|
196
|
+
if ext is not None:
|
197
|
+
return ext[1:].lower()
|
198
|
+
|
199
|
+
def _toFileUrl(self, path):
|
200
|
+
return uno.systemPathToFileUrl(abspath(path))
|
201
|
+
|
202
|
+
def _toProperties(self, dict):
|
203
|
+
props = []
|
204
|
+
for key in dict:
|
205
|
+
prop = PropertyValue()
|
206
|
+
prop.Name = key
|
207
|
+
prop.Value = dict[key]
|
208
|
+
props.append(prop)
|
209
|
+
return tuple(props)
|
210
|
+
|
211
|
+
|
212
|
+
if __name__ == "__main__":
|
213
|
+
from sys import argv, exit
|
214
|
+
|
215
|
+
if len(argv) < 3:
|
216
|
+
print "USAGE: python %s <input-file> <output-file>" % argv[0]
|
217
|
+
exit(255)
|
218
|
+
if not isfile(argv[1]):
|
219
|
+
print "no such input file: %s" % argv[1]
|
220
|
+
exit(1)
|
221
|
+
|
222
|
+
try:
|
223
|
+
converter = DocumentConverter(argv[3])
|
224
|
+
converter.convert(argv[1], argv[2])
|
225
|
+
except DocumentConversionException, exception:
|
226
|
+
print "ERROR! " + str(exception)
|
227
|
+
exit(1)
|
228
|
+
except ErrorCodeIOException, exception:
|
229
|
+
print "ERROR! ErrorCodeIOException %d" % exception.ErrCode
|
230
|
+
exit(1)
|
231
|
+
|
data/bin/wkhtmltopdf
ADDED
Binary file
|
data/lib/command_wrap.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'RMagick'
|
2
|
+
|
3
|
+
module CommandWrap
|
4
|
+
|
5
|
+
# Creates a screenshot from the given url
|
6
|
+
# Uses CutyCapt (cutycapt.sourceforge.net)
|
7
|
+
def self.capture (url, target)
|
8
|
+
command = CommandWrap::Config::Xvfb.command(File.dirname(__FILE__) + "/../bin/CutyCapt --min-width=1024 --min-height=768 --url=#{url} --out=#{target}")
|
9
|
+
`#{command}`
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.htmltopdf (source, target)
|
13
|
+
command = CommandWrap::Config::Xvfb.command(File.dirname(__FILE__) + "/../bin/wkhtmltopdf --print-media-type #{source} #{target}")
|
14
|
+
`#{command}`
|
15
|
+
end
|
16
|
+
|
17
|
+
# Sources consists of paths followed by the filename that must be used in the zip
|
18
|
+
def self.zip (target, *sources)
|
19
|
+
targetdir = "#{CommandWrap::Config.tmp_dir}/zip"
|
20
|
+
id = 1
|
21
|
+
while File.exists?(targetdir)
|
22
|
+
targetdir = "#{CommandWrap::Config.tmp_dir}/zip#{id}"
|
23
|
+
id += 1
|
24
|
+
end
|
25
|
+
FileUtils.mkdir(targetdir)
|
26
|
+
|
27
|
+
path = ''
|
28
|
+
sources.each do |value|
|
29
|
+
if path == ''
|
30
|
+
path = value
|
31
|
+
else
|
32
|
+
FileUtils.copy(path, "#{targetdir}/#{value}")
|
33
|
+
path = ''
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
`#{CommandWrap::Config.zip} -j #{target} #{targetdir}/*`
|
38
|
+
|
39
|
+
FileUtils.rm_rf(targetdir)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.extension (filename)
|
43
|
+
return '' unless filename.include?('.')
|
44
|
+
filename.split('.').last
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.preview (source, target, width, height)
|
48
|
+
extension = self.extension(source).upcase
|
49
|
+
|
50
|
+
# Image ?
|
51
|
+
formats = Magick.formats
|
52
|
+
if formats.key?(extension) && formats[extension].include?('r')
|
53
|
+
begin
|
54
|
+
CommandWrap::Image.scale(source, target, width, height)
|
55
|
+
return true
|
56
|
+
rescue
|
57
|
+
return false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
tmppdf = self.temp('pdf')
|
62
|
+
tmppng = self.temp('png')
|
63
|
+
begin
|
64
|
+
# Create a pdf of the document
|
65
|
+
CommandWrap::OpenOffice.convert(source, tmppdf)
|
66
|
+
# Create a screenshot of first page of the generated pdf
|
67
|
+
CommandWrap::Pdf.preview(tmppdf, tmppng)
|
68
|
+
# Scale it down to thumb
|
69
|
+
CommandWrap::Image.scale(tmppng, target, width, height)
|
70
|
+
return true
|
71
|
+
rescue
|
72
|
+
|
73
|
+
ensure
|
74
|
+
# Cleanup
|
75
|
+
File.delete(tmppdf) if File.exists?(tmppdf) && File.writable?(tmppdf)
|
76
|
+
File.delete(tmppng) if File.exists?(tmppng) && File.writable?(tmppng)
|
77
|
+
end
|
78
|
+
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
|
82
|
+
# Generates a temp filepath for the given extension
|
83
|
+
def self.temp (extension)
|
84
|
+
path = "#{CommandWrap::Config.tmp_dir}/tmp.#{extension}"
|
85
|
+
id = 1
|
86
|
+
while File.exists?(path)
|
87
|
+
path = "#{CommandWrap::Config.tmp_dir}/tmp.#{id}.#{extension}"
|
88
|
+
id += 1
|
89
|
+
end
|
90
|
+
|
91
|
+
path
|
92
|
+
end
|
93
|
+
|
94
|
+
# Tries to convert content of file to plaintext or html
|
95
|
+
def self.index (path)
|
96
|
+
extension = CommandWrap.extension(path).downcase
|
97
|
+
|
98
|
+
if extension == 'txt'
|
99
|
+
return IO.read(path)
|
100
|
+
end
|
101
|
+
|
102
|
+
if extension == 'html' || extension == 'htm'
|
103
|
+
return IO.read(path)
|
104
|
+
end
|
105
|
+
|
106
|
+
tmp = self.temp('html')
|
107
|
+
begin
|
108
|
+
CommandWrap::OpenOffice.convert(path, tmp)
|
109
|
+
return IO.read(tmp) if File.exists?(tmp)
|
110
|
+
rescue
|
111
|
+
ensure
|
112
|
+
File.delete(tmp) if File.exists?(tmp) && File.writable?(tmp)
|
113
|
+
end
|
114
|
+
|
115
|
+
''
|
116
|
+
end
|
117
|
+
|
118
|
+
autoload :Image, File.dirname(__FILE__) + "/command_wrap/image"
|
119
|
+
autoload :OpenOffice, File.dirname(__FILE__) + "/command_wrap/open_office"
|
120
|
+
autoload :Config, File.dirname(__FILE__) + "/command_wrap/config"
|
121
|
+
autoload :Pdf, File.dirname(__FILE__) + "/command_wrap/pdf"
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module CommandWrap
|
2
|
+
|
3
|
+
module Config
|
4
|
+
|
5
|
+
def self.tmp_dir
|
6
|
+
@tmp_dir ||= '/tmp'
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.tmp_dir= (tmp_dir)
|
10
|
+
@tmp_dir = tmp_dir
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.pdftk
|
14
|
+
@pdftk ||= 'pdftk'
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.pdftk= (pdftk)
|
18
|
+
@pdftk = pdftk
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.zip
|
22
|
+
@zip ||= 'zip'
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.zip= (zip)
|
26
|
+
@zip = zip
|
27
|
+
end
|
28
|
+
|
29
|
+
autoload :OpenOffice, File.dirname(__FILE__) + "/config/open_office"
|
30
|
+
autoload :Xvfb, File.dirname(__FILE__) + "/config/xvfb"
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module CommandWrap::Config
|
2
|
+
|
3
|
+
module OpenOffice
|
4
|
+
|
5
|
+
def self.command
|
6
|
+
"#{executable} #{parsed_params}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.parsed_params
|
10
|
+
params.gsub('[port]', port.to_s).gsub('[host]', host)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.executable
|
14
|
+
@openoffice ||= "soffice"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.executable= (openoffice)
|
18
|
+
@openoffice = openoffice
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.port
|
22
|
+
@port ||= 8000
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.port= (port)
|
26
|
+
@port = port
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.host
|
30
|
+
@host ||= "127.0.0.1"
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.host= (host)
|
34
|
+
@host = host
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.params
|
38
|
+
@params ||= '-headless -display :30 -accept="socket,host=[host],port=[port];urp;" -nofirststartwizard'
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.params= (params)
|
42
|
+
@params = params
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.xvfb
|
46
|
+
@xvfb ||= 'Xvfb :30 -screen 0 1024x768x24'
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.xvfb= (xvfb)
|
50
|
+
@xvfb = xvfb
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.stop_xvfb
|
54
|
+
@stop_xvfb ||= 'killall -9 Xvfb'
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.stop_xvfb= (stop_xvfb)
|
58
|
+
@stop_xvfb = stop_xvfb
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.stop
|
62
|
+
@stop ||= 'killall -9 soffice.bin'
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.stop= (stop)
|
66
|
+
@stop = stop
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.python
|
70
|
+
@python ||= 'python'
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.python= (python)
|
74
|
+
@python = python
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module CommandWrap::Config
|
2
|
+
|
3
|
+
module Xvfb
|
4
|
+
|
5
|
+
def self.executable
|
6
|
+
@executable ||= "xvfb-run"
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.executable= (executeable)
|
10
|
+
@executable = executeable
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.params
|
14
|
+
@params ||= '--wait=0 --server-args="-screen 0, 1024x768x24"'
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.params= (params)
|
18
|
+
@params = params
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.command (subcommand)
|
22
|
+
"#{executable} #{params} #{subcommand}"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'RMagick'
|
2
|
+
|
3
|
+
module CommandWrap
|
4
|
+
|
5
|
+
module Image
|
6
|
+
|
7
|
+
def self.dimensions (path)
|
8
|
+
img = Magick::Image.read(path)[0]
|
9
|
+
{ :width => img.columns, :height => img.rows }
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.scale (source, target, width, height = nil)
|
13
|
+
height = width unless height
|
14
|
+
|
15
|
+
# Scale source
|
16
|
+
simg = Magick::Image.read(source)[0]
|
17
|
+
|
18
|
+
if simg.columns > width && simg.rows > height
|
19
|
+
simg.resize_to_fit!(width, height)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Create transparent image
|
23
|
+
timg = Magick::Image.new(width, height)
|
24
|
+
d = Magick::Draw.new
|
25
|
+
d.fill('white')
|
26
|
+
d.draw(timg)
|
27
|
+
timg = timg.transparent('white')
|
28
|
+
|
29
|
+
# Insert thumb
|
30
|
+
timg.composite!(simg, Magick::CenterGravity, Magick::OverCompositeOp)
|
31
|
+
|
32
|
+
# Save result
|
33
|
+
timg.write(target)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module CommandWrap
|
2
|
+
|
3
|
+
module OpenOffice
|
4
|
+
|
5
|
+
autoload :Server, File.dirname(__FILE__) + "/open_office/server"
|
6
|
+
|
7
|
+
# Converts the given source to target
|
8
|
+
#
|
9
|
+
# Possible parameters:
|
10
|
+
# source (path to source file) + target (path to target file)
|
11
|
+
# content (content of source file) + source extension (extension of source file) + target extension (extension of target file)
|
12
|
+
def self.convert (*args)
|
13
|
+
if args.length == 2
|
14
|
+
source = args[0]
|
15
|
+
target = args[1]
|
16
|
+
elsif args.length == 3
|
17
|
+
source = CommandWrap.temp(args[1])
|
18
|
+
target = CommandWrap.temp(args[2])
|
19
|
+
# Save Content
|
20
|
+
File.open(source, 'w') do |file|
|
21
|
+
file.write args[0]
|
22
|
+
end
|
23
|
+
else
|
24
|
+
raise ArgumentError.new('wrong number of arguments')
|
25
|
+
end
|
26
|
+
command = File.dirname(__FILE__) + "/../../bin/DocumentConverter.py"
|
27
|
+
result = `#{CommandWrap::Config::OpenOffice.python} #{command} #{source} #{target} #{CommandWrap::Config::OpenOffice.port}`
|
28
|
+
raise result unless result.strip == ''
|
29
|
+
|
30
|
+
if args.length == 3
|
31
|
+
result = IO.read(target)
|
32
|
+
File.delete(source) if File.writable?(source)
|
33
|
+
File.delete(target) if File.writable?(target)
|
34
|
+
result
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CommandWrap::OpenOffice
|
2
|
+
|
3
|
+
module Server
|
4
|
+
|
5
|
+
def self.start
|
6
|
+
pid1 = fork do
|
7
|
+
exec FileUtils::Config::OpenOffice.xvfb
|
8
|
+
end
|
9
|
+
sleep 5 # 5 seconden wachten tot xvfb draait
|
10
|
+
pid2 = fork do
|
11
|
+
exec FileUtils::Config::OpenOffice.command
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.stop
|
16
|
+
`#{FileUtils::Config::OpenOffice.stop_xvfb}`
|
17
|
+
sleep 5
|
18
|
+
`#{FileUtils::Config::OpenOffice.stop}`
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.restart
|
22
|
+
stop
|
23
|
+
sleep 5
|
24
|
+
start
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'RMagick'
|
2
|
+
|
3
|
+
module CommandWrap
|
4
|
+
|
5
|
+
module Pdf
|
6
|
+
|
7
|
+
def self.metas (path)
|
8
|
+
metas = {}
|
9
|
+
|
10
|
+
key = ''
|
11
|
+
`#{CommandWrap::Config.pdftk} #{path} dump_data`.gsub("\r\n", "\n").gsub("\r", "\n").split("\n").each do |line|
|
12
|
+
parts = line.split(':')
|
13
|
+
parts[1] = parts[1].gsub('�', '')
|
14
|
+
if parts[0] == 'InfoValue'
|
15
|
+
if key != ''
|
16
|
+
metas[key] = parts[1].strip
|
17
|
+
key = ''
|
18
|
+
end
|
19
|
+
elsif parts[0] == 'InfoKey'
|
20
|
+
key = parts[1].strip
|
21
|
+
else
|
22
|
+
metas[parts[0].strip] = parts[1].strip
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
metas
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.pages (path)
|
30
|
+
metas(path)['NumberOfPages'].to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
# Generates an image of a pdf page
|
34
|
+
# Page starts with 0
|
35
|
+
def self.preview (source, target, page = 0)
|
36
|
+
pdf = Magick::ImageList.new(source)[page]
|
37
|
+
pdf.write target
|
38
|
+
end
|
39
|
+
|
40
|
+
# Merges the given pdfs into a single pdf
|
41
|
+
def self.merge (target, *sources)
|
42
|
+
`#{CommandWrap::Config.pdftk} #{sources.join(' ')} cat output #{target}`
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
TEST.HTM
|
@@ -0,0 +1 @@
|
|
1
|
+
TESTING
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
test
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../test_helper"
|
2
|
+
|
3
|
+
class CommandWrapTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_capture
|
6
|
+
assert_nothing_raised do
|
7
|
+
path = File.dirname(__FILE__) + "/../../google.png"
|
8
|
+
File.delete(path) if File.exists?(path)
|
9
|
+
CommandWrap.capture('http://www.google.be', path)
|
10
|
+
assert File.exists?(path)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_zip
|
15
|
+
target = File.dirname(__FILE__) + "/../../result.zip"
|
16
|
+
source1 = File.dirname(__FILE__) + "/../helpers/2pages.pdf"
|
17
|
+
source2 = File.dirname(__FILE__) + "/../helpers/test.odt"
|
18
|
+
|
19
|
+
File.delete(target) if File.exists?(target)
|
20
|
+
|
21
|
+
assert_nothing_raised do
|
22
|
+
CommandWrap.zip(target, source1, 'doc.pdf', source2, 'doc.odt')
|
23
|
+
assert File.exists?(target)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_extension
|
28
|
+
assert_equal 'exe', CommandWrap.extension('test.exe')
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_extension_none
|
32
|
+
assert_equal '', CommandWrap.extension('test')
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_preview
|
36
|
+
target = File.dirname(__FILE__) + "/../../result.png"
|
37
|
+
|
38
|
+
assert_nothing_raised do
|
39
|
+
source = File.dirname(__FILE__) + "/../../README"
|
40
|
+
|
41
|
+
assert_nil CommandWrap.preview(source, target, 100, 100)
|
42
|
+
|
43
|
+
# Image
|
44
|
+
source = File.dirname(__FILE__) + "/../helpers/scale.jpg"
|
45
|
+
|
46
|
+
File.delete(target) if File.exists?(target)
|
47
|
+
|
48
|
+
assert CommandWrap.preview(source, target, 100, 100), 'Creation of image preview'
|
49
|
+
assert File.exists?(target), 'File exists? preview of image'
|
50
|
+
|
51
|
+
# Document
|
52
|
+
source = File.dirname(__FILE__) + "/../helpers/test.odt"
|
53
|
+
|
54
|
+
File.delete(target) if File.exists?(target)
|
55
|
+
|
56
|
+
assert CommandWrap.preview(source, target, 100, 100), 'Creation of odt preview'
|
57
|
+
assert File.exists?(target), 'File exists? preview of odt'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_temppath
|
62
|
+
assert_nothing_raised do
|
63
|
+
path1 = CommandWrap.temp('jpg')
|
64
|
+
assert_equal "#{CommandWrap::Config.tmp_dir}/tmp.jpg", path1
|
65
|
+
|
66
|
+
FileUtils.touch(path1)
|
67
|
+
|
68
|
+
path2 = CommandWrap.temp('jpg')
|
69
|
+
assert_equal "#{CommandWrap::Config.tmp_dir}/tmp.1.jpg", path2
|
70
|
+
|
71
|
+
File.delete(path1)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_index
|
76
|
+
assert_nothing_raised do
|
77
|
+
assert_equal '', CommandWrap.index(File.dirname(__FILE__) + "/../helpers/scale.jpg")
|
78
|
+
assert_equal 'test', CommandWrap.index(File.dirname(__FILE__) + "/../helpers/test.txt")
|
79
|
+
assert CommandWrap.index(File.dirname(__FILE__) + "/../helpers/test.odt").include?('TEST'), 'TEST in odt'
|
80
|
+
assert_equal 'TESTING', CommandWrap.index(File.dirname(__FILE__) + "/../helpers/test.html")
|
81
|
+
assert_equal 'TEST.HTM', CommandWrap.index(File.dirname(__FILE__) + "/../helpers/test.htm")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_preview_mpg
|
86
|
+
source = File.dirname(__FILE__) + "/../helpers/test.mpg"
|
87
|
+
target = CommandWrap.temp('png')
|
88
|
+
assert_nothing_raised do
|
89
|
+
assert_equal false, CommandWrap.preview(source, target, 160, 200)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_htmltopdf
|
94
|
+
sleep 1
|
95
|
+
source = File.dirname(__FILE__) + "/../helpers/test.html"
|
96
|
+
target = CommandWrap.temp('pdf')
|
97
|
+
assert_nothing_raised do
|
98
|
+
CommandWrap.htmltopdf(source, target)
|
99
|
+
assert File.exists?(target)
|
100
|
+
File.delete(target)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../test_helper"
|
2
|
+
|
3
|
+
class ConfigOpenOfficeTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_exists
|
6
|
+
assert_nothing_raised do
|
7
|
+
CommandWrap::Config::OpenOffice
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@params = {
|
13
|
+
:executable => CommandWrap::Config::OpenOffice.executable,
|
14
|
+
:host => CommandWrap::Config::OpenOffice.host,
|
15
|
+
:port => CommandWrap::Config::OpenOffice.port,
|
16
|
+
:params => CommandWrap::Config::OpenOffice.params,
|
17
|
+
:xvfb => CommandWrap::Config::OpenOffice.xvfb,
|
18
|
+
:stop_xvfb => CommandWrap::Config::OpenOffice.stop_xvfb,
|
19
|
+
:stop => CommandWrap::Config::OpenOffice.stop,
|
20
|
+
:python => CommandWrap::Config::OpenOffice.python
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
# Reset of config
|
25
|
+
def teardown
|
26
|
+
CommandWrap::Config::OpenOffice.executable = @params[:executable]
|
27
|
+
CommandWrap::Config::OpenOffice.host = @params[:host]
|
28
|
+
CommandWrap::Config::OpenOffice.port = @params[:port]
|
29
|
+
CommandWrap::Config::OpenOffice.params = @params[:params]
|
30
|
+
CommandWrap::Config::OpenOffice.xvfb = @params[:xvfb]
|
31
|
+
CommandWrap::Config::OpenOffice.stop_xvfb = @params[:stop_xvfb]
|
32
|
+
CommandWrap::Config::OpenOffice.stop = @params[:stop]
|
33
|
+
CommandWrap::Config::OpenOffice.python = @params[:python]
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_config_openoffice_executable
|
37
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.executable
|
38
|
+
assert_equal 'soffice', CommandWrap::Config::OpenOffice.executable
|
39
|
+
CommandWrap::Config::OpenOffice.executable = 'soffice.exe'
|
40
|
+
assert_equal 'soffice.exe', CommandWrap::Config::OpenOffice.executable
|
41
|
+
CommandWrap::Config::OpenOffice.executable = 'soffice'
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_config_openoffice_port
|
45
|
+
assert_kind_of Integer, CommandWrap::Config::OpenOffice.port
|
46
|
+
assert_equal 8000, CommandWrap::Config::OpenOffice.port
|
47
|
+
CommandWrap::Config::OpenOffice.port = 8020
|
48
|
+
assert_equal 8020, CommandWrap::Config::OpenOffice.port
|
49
|
+
CommandWrap::Config::OpenOffice.port = 8000
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_config_openoffice_host
|
53
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.host
|
54
|
+
assert_equal '127.0.0.1', CommandWrap::Config::OpenOffice.host
|
55
|
+
CommandWrap::Config::OpenOffice.host = 'localhost'
|
56
|
+
assert_equal 'localhost', CommandWrap::Config::OpenOffice.host
|
57
|
+
CommandWrap::Config::OpenOffice.host = '127.0.0.1'
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_config_openoffice_params
|
61
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.params
|
62
|
+
assert_equal '-headless -display :30 -accept="socket,host=[host],port=[port];urp;" -nofirststartwizard', CommandWrap::Config::OpenOffice.params
|
63
|
+
CommandWrap::Config::OpenOffice.params = '-headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard'
|
64
|
+
assert_equal '-headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard', CommandWrap::Config::OpenOffice.params
|
65
|
+
CommandWrap::Config::OpenOffice.params = '-headless -accept="socket,host=[host],port=[port];urp;" -nofirststartwizard'
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_config_openoffice_command
|
69
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.command
|
70
|
+
assert_equal 'soffice -headless -display :30 -accept="socket,host=127.0.0.1,port=8000;urp;" -nofirststartwizard', CommandWrap::Config::OpenOffice.command
|
71
|
+
|
72
|
+
CommandWrap::Config::OpenOffice.executable = 'soffice.exe'
|
73
|
+
CommandWrap::Config::OpenOffice.host = 'localhost'
|
74
|
+
CommandWrap::Config::OpenOffice.port = 8080
|
75
|
+
CommandWrap::Config::OpenOffice.params = '-headless -display :30 -accept="socket,host=[host],port=[port];urp;"'
|
76
|
+
|
77
|
+
assert_equal 'soffice.exe -headless -display :30 -accept="socket,host=localhost,port=8080;urp;"', CommandWrap::Config::OpenOffice.command
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_config_openoffice_xvfb
|
81
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.xvfb
|
82
|
+
assert_equal 'Xvfb :30 -screen 0 1024x768x24', CommandWrap::Config::OpenOffice.xvfb
|
83
|
+
CommandWrap::Config::OpenOffice.xvfb = 'Xvfb'
|
84
|
+
assert_equal 'Xvfb', CommandWrap::Config::OpenOffice.xvfb
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_config_openoffice_stop_xvfb
|
88
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.stop_xvfb
|
89
|
+
assert_equal 'killall -9 Xvfb', CommandWrap::Config::OpenOffice.stop_xvfb
|
90
|
+
CommandWrap::Config::OpenOffice.stop_xvfb = 'echo "dummy"'
|
91
|
+
assert_equal 'echo "dummy"', CommandWrap::Config::OpenOffice.stop_xvfb
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_config_openoffice_stop
|
95
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.stop
|
96
|
+
assert_equal 'killall -9 soffice.bin', CommandWrap::Config::OpenOffice.stop
|
97
|
+
CommandWrap::Config::OpenOffice.stop = 'echo "dummy"'
|
98
|
+
assert_equal 'echo "dummy"', CommandWrap::Config::OpenOffice.stop
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_config_openoffice_python
|
102
|
+
assert_kind_of String, CommandWrap::Config::OpenOffice.python
|
103
|
+
assert_equal 'python', CommandWrap::Config::OpenOffice.python
|
104
|
+
CommandWrap::Config::OpenOffice.python = '/usr/bin/python'
|
105
|
+
assert_equal '/usr/bin/python', CommandWrap::Config::OpenOffice.python
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../test_helper"
|
2
|
+
|
3
|
+
class ConfigTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_exists
|
6
|
+
assert_nothing_raised do
|
7
|
+
CommandWrap::Config
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_tmp_dir
|
12
|
+
tmp_dir = '/tmp'
|
13
|
+
assert_equal tmp_dir, CommandWrap::Config.tmp_dir
|
14
|
+
CommandWrap::Config.tmp_dir = '/home/test/tmp'
|
15
|
+
assert_equal '/home/test/tmp', CommandWrap::Config.tmp_dir
|
16
|
+
CommandWrap::Config.tmp_dir = tmp_dir
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_pdftk
|
20
|
+
pdftk = 'pdftk'
|
21
|
+
assert_equal pdftk, CommandWrap::Config.pdftk
|
22
|
+
assert_equal 'pdftk', CommandWrap::Config.pdftk
|
23
|
+
CommandWrap::Config.pdftk = '/usr/bin/pdftk'
|
24
|
+
assert_equal '/usr/bin/pdftk', CommandWrap::Config.pdftk
|
25
|
+
CommandWrap::Config.pdftk = pdftk
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_zip
|
29
|
+
zip = 'zip'
|
30
|
+
assert_equal 'zip', CommandWrap::Config.zip
|
31
|
+
CommandWrap::Config.zip = '/usr/bin/zip'
|
32
|
+
assert_equal '/usr/bin/zip', CommandWrap::Config.zip
|
33
|
+
CommandWrap::Config.zip = zip
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../test_helper"
|
2
|
+
|
3
|
+
class ConfigXvfbTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_exists
|
6
|
+
assert_nothing_raised do
|
7
|
+
CommandWrap::Config::Xvfb
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
CommandWrap::Config::Xvfb.executable = 'xvfb-run'
|
13
|
+
CommandWrap::Config::Xvfb.params = '--wait=0 --server-args="-screen 0, 1024x768x24"'
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_config_xvbf_executable
|
17
|
+
assert_kind_of String, CommandWrap::Config::Xvfb.executable
|
18
|
+
assert_equal 'xvfb-run', CommandWrap::Config::Xvfb.executable
|
19
|
+
CommandWrap::Config::Xvfb.executable = '/usr/bin/xvfb-run'
|
20
|
+
assert_equal '/usr/bin/xvfb-run', CommandWrap::Config::Xvfb.executable
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_params
|
24
|
+
assert_kind_of String, CommandWrap::Config::Xvfb.params
|
25
|
+
assert_equal '--wait=0 --server-args="-screen 0, 1024x768x24"', CommandWrap::Config::Xvfb.params
|
26
|
+
CommandWrap::Config::Xvfb.params = 'dummy'
|
27
|
+
assert_equal 'dummy', CommandWrap::Config::Xvfb.params
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_command
|
31
|
+
assert_equal 'xvfb-run --wait=0 --server-args="-screen 0, 1024x768x24" echo "test"', CommandWrap::Config::Xvfb.command('echo "test"')
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class ImageTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_exists
|
6
|
+
assert_nothing_raised do
|
7
|
+
CommandWrap::Image
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_dimensions
|
12
|
+
dim = { :width => 150, :height => 200 }
|
13
|
+
|
14
|
+
assert_equal dim, CommandWrap::Image.dimensions(File.dirname(__FILE__) + "/../helpers/img150x200.jpg")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_scale
|
18
|
+
dim = { :width => 100, :height => 100 }
|
19
|
+
source = File.dirname(__FILE__) + "/../helpers/scale.jpg"
|
20
|
+
target = File.dirname(__FILE__) + "/../../target.png"
|
21
|
+
|
22
|
+
File.delete(target) if File.exists?(target)
|
23
|
+
|
24
|
+
CommandWrap::Image.scale(source, target, 100)
|
25
|
+
assert File.exists?(target)
|
26
|
+
assert_equal dim, CommandWrap::Image.dimensions(target)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_scale_width_and_height
|
30
|
+
dim = { :width => 100, :height => 150 }
|
31
|
+
source = File.dirname(__FILE__) + "/../helpers/scale.jpg"
|
32
|
+
target = File.dirname(__FILE__) + "/../../target2.png"
|
33
|
+
|
34
|
+
File.delete(target) if File.exists?(target)
|
35
|
+
|
36
|
+
CommandWrap::Image.scale(source, target, 100, 150)
|
37
|
+
assert File.exists?(target)
|
38
|
+
assert_equal dim, CommandWrap::Image.dimensions(target)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_scale_width_and_height_big
|
42
|
+
dim = { :width => 1000, :height => 1500 }
|
43
|
+
source = File.dirname(__FILE__) + "/../helpers/scale.jpg"
|
44
|
+
target = File.dirname(__FILE__) + "/../../target3.png"
|
45
|
+
|
46
|
+
File.delete(target) if File.exists?(target)
|
47
|
+
|
48
|
+
CommandWrap::Image.scale(source, target, 1000, 1500)
|
49
|
+
assert File.exists?(target)
|
50
|
+
assert_equal dim, CommandWrap::Image.dimensions(target)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../test_helper"
|
2
|
+
|
3
|
+
class OpenOfficeTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_exists
|
6
|
+
assert_nothing_raised do
|
7
|
+
CommandWrap::OpenOffice
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_convert
|
12
|
+
assert_nothing_raised do
|
13
|
+
path = CommandWrap.temp('pdf')
|
14
|
+
CommandWrap::OpenOffice.convert File.dirname(__FILE__) + "/../helpers/test.odt", path
|
15
|
+
assert File.exists?(path), 'Pdf bestaat niet'
|
16
|
+
File.delete(path) if File.writable?(path)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_convert_stream
|
21
|
+
assert_nothing_raised do
|
22
|
+
content = IO.read(File.dirname(__FILE__) + "/../helpers/test.odt")
|
23
|
+
assert_kind_of String, CommandWrap::OpenOffice.convert(content, 'odt', 'pdf')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../test_helper"
|
2
|
+
|
3
|
+
class PdfTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
TEST_PDF = File.dirname(__FILE__) + "/../helpers/2pages.pdf"
|
6
|
+
|
7
|
+
def test_exists
|
8
|
+
assert_nothing_raised do
|
9
|
+
CommandWrap::Pdf
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_metas
|
14
|
+
assert_nothing_raised do
|
15
|
+
metas = CommandWrap::Pdf.metas(TEST_PDF)
|
16
|
+
assert_kind_of Hash, metas
|
17
|
+
assert_equal 'OpenOffice.org 3.2', metas['Producer']
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_pages
|
22
|
+
assert_equal 2, CommandWrap::Pdf.pages(TEST_PDF)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_screenshot
|
26
|
+
target1 = File.dirname(__FILE__) + "/../../pdf1.jpg"
|
27
|
+
target2 = File.dirname(__FILE__) + "/../../pdf2.jpg"
|
28
|
+
target3 = File.dirname(__FILE__) + "/../../pdf3.jpg"
|
29
|
+
|
30
|
+
[target1, target2, target2].each do |target|
|
31
|
+
File.delete(target) if File.exists?(target)
|
32
|
+
end
|
33
|
+
|
34
|
+
assert_nothing_raised do
|
35
|
+
CommandWrap::Pdf.preview(TEST_PDF, target1)
|
36
|
+
assert File.exists?(target1)
|
37
|
+
CommandWrap::Pdf.preview(TEST_PDF, target2, 0)
|
38
|
+
assert File.exists?(target2)
|
39
|
+
CommandWrap::Pdf.preview(TEST_PDF, target3, 1)
|
40
|
+
assert File.exists?(target3)
|
41
|
+
assert_equal IO.read(target1), IO.read(target2)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_merge
|
46
|
+
source1 = File.dirname(__FILE__) + "/../helpers/2pages.pdf"
|
47
|
+
source2 = File.dirname(__FILE__) + "/../helpers/pdf2.pdf"
|
48
|
+
target = File.dirname(__FILE__) + "/../../result.pdf"
|
49
|
+
|
50
|
+
File.delete(target) if File.exists?(target)
|
51
|
+
|
52
|
+
assert_nothing_raised do
|
53
|
+
CommandWrap::Pdf.merge(target, source1, source2)
|
54
|
+
assert File.exists?(target)
|
55
|
+
assert_equal 3, CommandWrap::Pdf.pages(target)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_merge_3
|
60
|
+
source1 = File.dirname(__FILE__) + "/../helpers/2pages.pdf"
|
61
|
+
source2 = File.dirname(__FILE__) + "/../helpers/pdf2.pdf"
|
62
|
+
source3 = File.dirname(__FILE__) + "/../helpers/pdf3.pdf"
|
63
|
+
target = File.dirname(__FILE__) + "/../../result.pdf"
|
64
|
+
|
65
|
+
File.delete(target) if File.exists?(target)
|
66
|
+
|
67
|
+
assert_nothing_raised do
|
68
|
+
CommandWrap::Pdf.merge(target, source1, source2, source3)
|
69
|
+
assert File.exists?(target)
|
70
|
+
assert_equal 4, CommandWrap::Pdf.pages(target)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: command_wrap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 9
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: "0.1"
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Stefaan Colman
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-02-24 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rmagick
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 57
|
29
|
+
segments:
|
30
|
+
- 2
|
31
|
+
- 13
|
32
|
+
- 1
|
33
|
+
version: 2.13.1
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
description: A set of utility classes to extract meta data from different file types
|
37
|
+
email:
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files: []
|
43
|
+
|
44
|
+
files:
|
45
|
+
- lib/command_wrap/config.rb
|
46
|
+
- lib/command_wrap/open_office.rb
|
47
|
+
- lib/command_wrap/config/open_office.rb
|
48
|
+
- lib/command_wrap/config/xvfb.rb
|
49
|
+
- lib/command_wrap/open_office/server.rb
|
50
|
+
- lib/command_wrap/image.rb
|
51
|
+
- lib/command_wrap/pdf.rb
|
52
|
+
- lib/command_wrap.rb
|
53
|
+
- tests/unit/command_wrap_test.rb
|
54
|
+
- tests/unit/pdf_test.rb
|
55
|
+
- tests/unit/config_test.rb
|
56
|
+
- tests/unit/open_office_test.rb
|
57
|
+
- tests/unit/config_xvfb_test.rb
|
58
|
+
- tests/unit/image_test.rb
|
59
|
+
- tests/unit/config_open_office_test.rb
|
60
|
+
- tests/unit/open_office_server_test.rb
|
61
|
+
- tests/helpers/test.odt
|
62
|
+
- tests/helpers/2pages.pdf
|
63
|
+
- tests/helpers/scale.jpg
|
64
|
+
- tests/helpers/pdf3.pdf
|
65
|
+
- tests/helpers/test.htm
|
66
|
+
- tests/helpers/test.html
|
67
|
+
- tests/helpers/test.txt
|
68
|
+
- tests/helpers/img150x200.jpg
|
69
|
+
- tests/helpers/error.mpg
|
70
|
+
- tests/helpers/pdf2.pdf
|
71
|
+
- tests/test_helper.rb
|
72
|
+
- README
|
73
|
+
- bin/wkhtmltopdf
|
74
|
+
- bin/CutyCapt
|
75
|
+
- bin/openoffice_server.rb
|
76
|
+
- bin/DocumentConverter.py
|
77
|
+
has_rdoc: true
|
78
|
+
homepage:
|
79
|
+
licenses: []
|
80
|
+
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
requirements: []
|
105
|
+
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 1.5.2
|
108
|
+
signing_key:
|
109
|
+
specification_version: 3
|
110
|
+
summary: Extracting meta data from file
|
111
|
+
test_files:
|
112
|
+
- tests/unit/command_wrap_test.rb
|
113
|
+
- tests/unit/pdf_test.rb
|
114
|
+
- tests/unit/config_test.rb
|
115
|
+
- tests/unit/open_office_test.rb
|
116
|
+
- tests/unit/config_xvfb_test.rb
|
117
|
+
- tests/unit/image_test.rb
|
118
|
+
- tests/unit/config_open_office_test.rb
|
119
|
+
- tests/unit/open_office_server_test.rb
|
120
|
+
- tests/test_helper.rb
|