boxview.rb 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0b941ac2af141921f240942901522a950d20990
4
- data.tar.gz: dea4cceb7e4b66566476ac3f4167f3cad0ab0690
3
+ metadata.gz: 27021f62d0bc30f3e7167e0414154a816278e025
4
+ data.tar.gz: d72b878111414766d2ec5342f3f72e5f22fc7470
5
5
  SHA512:
6
- metadata.gz: 4baf1da5ad28fc384f6007b60035b370e3cda345579629f03664af8613ee77fb91aaf7d89ce1e882e9f617ee5fb82e539df21f92c8c7801f930345c1dcc462c4
7
- data.tar.gz: 53dea99d41a89c8af6fb4ed408c8d0affdfdb385ea5b6db457df48d0e8a4766bba35510fef9db4a055192b74f6efa4b8c475ab00a8037948d1fc6576cdf76c26
6
+ metadata.gz: 8480a8d2e9a59213d5302d88871c28d06c58cea8809fb68f99ba7fa791a19b68fa6d85a34565820c57e895ad040b4fd3f25287178a92cd8f0cae04e858a4f545
7
+ data.tar.gz: 7bf174dd6afbd48f330969a44996a5a1e4462732fc01ecd0fda22538f89e8d93cbec4b8cdf7f5082dac2945d89807ff669ef8a2d141edb7ecba7620a6b1e5e65
@@ -2,7 +2,7 @@ language: ruby
2
2
  env:
3
3
  global:
4
4
  # BoxView API Key
5
- secure: "cOxF+9whdZHoCAxOPX0xiM7X312pRNoMaxHLDsBPaVLnk2kVKEURvJCoLqwhgsh9PVwa8wAXUk/cwUVN43isM3CdoMM4+5bZg18X/kQGM8zltKJCr/AONaBKV8gadVvmwdAsvzrQ/Mj4Qyb7AGJfNKjGPOZL8A0Pl1NypYz06lI="
5
+ secure: "QFH/gcuFT6bEXiXpAEIzSc+awrXB23dbhD1RUHneBjzHCAhRnTmyiNuXRt/YubOmt26ttEpQ0nh2D+DbW62ozFiaDaD05ho7Z7YgN1N6wvZD2ST+BiYPKVZWu8sTgQZ9ax8i9uTb3t+Ksu4X5g0cGg9vEdPFKC9PlQhEuwH7ojQ="
6
6
  rvm:
7
7
  - 2.0.0
8
8
  - 2.1.0
data/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/getlua/boxviewrb.svg)](https://travis-ci.org/getlua/boxviewrb)
4
4
 
5
- A BoxView API wrapper. Built using the power of HTTParty to communicate with the BoxView API. The BoxView API has added some new features and improved documentation, this lib takes care of all of those new additions for you. You can learn more at the [developer page](http://developers.box.com/view/). Note this product and API are still in beta, and likely to change in the future. Boxviewrb works with all available requests that are documented by BoxView at the time of writing.
5
+ A BoxView API wrapper. Built using the power of HTTParty to communicate with the BoxView API. The BoxView API has added some new features and improved documentation, this lib takes care of all of those new additions for you. You can learn more at the [developer page](https://box-view.readme.io/). Note this product and API are still in beta, and likely to change in the future. Boxviewrb works with all available requests that are documented by BoxView at the time of writing.
6
6
 
7
7
  ##### Table of Contents
8
8
  * [Installation](#installation)
9
9
  * [Usage](#usage)
10
10
  * [Configuration](#configuration)
11
11
  * [Document](#document)
12
- * [Create](#create_document)
12
+ * [Create](#create-document)
13
13
  * [MultiPart](#multipart)
14
14
  * [List](#list)
15
15
  * [Show](#show)
@@ -18,19 +18,18 @@ A BoxView API wrapper. Built using the power of HTTParty to communicate with the
18
18
  * [Thumbnail](#thumbnail)
19
19
  * [Assets](#assets)
20
20
  * [Session](#session)
21
- * [Create](#create_session)
22
- * [Convenience Methods](#convenience_methods)
23
- * [Never Expire](#never_expire)
24
- * [View](#create_session)
25
- * [ViewerJS URL](#viewerjs_url)
26
- * [Viewer URL](#viewer_url)
27
- * [Supported MIMETypes](#supported_mimetypes)
28
- * [Supported File Extensions](#supported_file_extensions)
21
+ * [Create](#create-session)
22
+ * [Convenience Methods](#convenience-methods)
23
+ * [Never Expire](#never-expire)
24
+ * [View](#create-session)
25
+ * [ViewerJS URL](#viewerjs-url)
26
+ * [Viewer URL](#viewer-url)
27
+ * [Supported MIMETypes](#supported-mimetypes)
28
+ * [Supported File Extensions](#supported-file-extensions)
29
29
  * [Contributing](#contributing)
30
30
  * [Author](#author)
31
31
  * [License](#license)
32
32
 
33
- <a name="installation"/>
34
33
  ## Installation
35
34
 
36
35
  Add this line to your application's Gemfile:
@@ -45,10 +44,8 @@ Or install it yourself as:
45
44
 
46
45
  $ gem install boxview.rb
47
46
 
48
- <a name="usage"/>
49
47
  ## Usage
50
48
 
51
- <a name="configuration"/>
52
49
  ### Configuration
53
50
 
54
51
  Defining an api key is the only required configuration. To get your own API Key, visit [Box and get a developer account](https://app.box.com/developers/services). Then create a new Box View application. Scroll to the bottom of the application settings page to find your api key.
@@ -57,10 +54,8 @@ Defining an api key is the only required configuration. To get your own API Key,
57
54
  BoxView.api_key = "#{BOXVIEW_APIKEY}" # Example: 'gyheecmm6ckk8jutlowlzfh2tbg72kck'
58
55
  ```
59
56
 
60
- <a name="document"/>
61
57
  ### Document
62
58
 
63
- <a name="create_document"/>
64
59
  #### Create
65
60
 
66
61
  See below for how to create a document using boxviewrb. Not all the paramaters used are required. The url is the only parameter that will be necessary in order to make a successful call with the BoxView API. Name refers to the name of the document. Non_SVG refers to whether you want to support browsers that cannot support svg. The Height and Width parameters refer to the size of a thumbnail that will give Box an early start to generating your thumbnail for you. You must still make a second request for a thumbnail, but it will be made available sooner upon request.
@@ -80,7 +75,6 @@ BoxView::Document.create
80
75
  height: 100
81
76
  ```
82
77
 
83
- <a name="multipart"/>
84
78
  #### MultiPart
85
79
 
86
80
  If you have access to the actual file you want to upload to box, you can directly upload it via a multipart upload. This method requires the path to the file to be specified in order for it to send the file to box. If the filepath does not exist, an error will be thrown. The other params (name, thumbnail and non_svg) are the same as the create request params.
@@ -98,7 +92,6 @@ BoxView::Document.multipart
98
92
  height: 100
99
93
  ```
100
94
 
101
- <a name="list"/>
102
95
  #### List
103
96
 
104
97
  This request will respond with a list of all the documents that are currently tied to the api key that has been supplied. Delete requests will remove documents from this list. This method returns the response untouched.
@@ -107,7 +100,6 @@ This request will respond with a list of all the documents that are currently ti
107
100
  BoxView::Document.list
108
101
  ```
109
102
 
110
- <a name="show"/>
111
103
  #### Show
112
104
 
113
105
  Returns the metadata for a single document based on a specified document id. If the document has successfully been generated by box, the status of the document will be 'done'. If not the status will be 'error'. The status is returned in the response when calling show.
@@ -118,7 +110,6 @@ Required: `document_id`
118
110
  BoxView::Document.show document_id: '937778a1a54b4337a5351a78f7188a24'
119
111
  ```
120
112
 
121
- <a name="update"/>
122
113
  #### Update
123
114
 
124
115
  Update the metadata of a single document based on a specified document id. Only the name can be updated at this time.
@@ -131,7 +122,6 @@ BoxView::Document.update
131
122
  name: 'recipes'
132
123
  ```
133
124
 
134
- <a name="delete"/>
135
125
  #### Delete
136
126
 
137
127
  Removes a previously created document from the Box View servers. This request is destructive.
@@ -142,7 +132,6 @@ Required: `document_id`
142
132
  BoxView::Document.delete document_id: '937778a1a54b4337a5351a78f7188a24'
143
133
  ```
144
134
 
145
- <a name="thumbnail"/>
146
135
  #### Thumbnail
147
136
 
148
137
  A request to retrieve a thumbnail representation of a document. A document id must be specified in order to make the request. If the server response contains the response code `202` then the retry after attribute will be available when calling `BoxView::Document.retry_after`. This can be useful if Box is rate limiting.
@@ -156,7 +145,6 @@ BoxView::Document.thumbnail
156
145
  height: 100
157
146
  ```
158
147
 
159
- <a name="assets"/>
160
148
  #### Assets
161
149
 
162
150
  A request to retrieve a pdf or zip of the asset that was uploaded. The document will be retrieved as a pdf or zip. The zip contains compressed css/js/html that make up the converted document. This can be used in junction with viewerjs. This request defaults to zip if no type is specified.
@@ -169,10 +157,8 @@ BoxView::Document.assets
169
157
  type: 'pdf'
170
158
  ```
171
159
 
172
- <a name="session"/>
173
160
  ### Session
174
161
 
175
- <a name="create_session"/>
176
162
  #### Create
177
163
 
178
164
  Generating a document will give you a document id. Next you can create a session using this id. The session will begin the conversion process of the document. When Box is done converting your document it will be available to download through the assets method or the viewer url convenience method. A session expires after a set amount of time. You can set a duration or an expiration date for the session. If left blank, the session is set by box by default to expire in 60 minutes. Duration is marked in minutes. Expiration date is a timestamp. The variable is_downloadable refers to whether or not the box viewer will display a download button or not. If the server response contains the response code `202` then the retry after attribute will be available when calling `BoxView::Session.retry_after`.
@@ -191,10 +177,8 @@ BoxView::Session.create
191
177
  is_downloadable: true
192
178
  ```
193
179
 
194
- <a name="convenience_methods"/>
195
180
  ### Convenience Methods
196
181
 
197
- <a name="never_expire"/>
198
182
  #### Never Expire
199
183
 
200
184
  When generating a session if you want your session to last for a very long time (a thousand years) call this method.
@@ -203,7 +187,6 @@ When generating a session if you want your session to last for a very long time
203
187
  BoxView::Session.never_expire
204
188
  ```
205
189
 
206
- <a name="view"/>
207
190
  #### View
208
191
 
209
192
  Opens a default browser using the viewer url to view a BoxView converted document. Requires a `session_id`.
@@ -212,7 +195,6 @@ Opens a default browser using the viewer url to view a BoxView converted documen
212
195
  BoxView::Session.view
213
196
  ```
214
197
 
215
- <a name="viewerjs_url"/>
216
198
  #### ViewerJS URL
217
199
 
218
200
  This url can be used with viewerjs to display the assets without using the Box iframe or downloading the assets yourself. Requires a `session_id`.
@@ -221,7 +203,6 @@ This url can be used with viewerjs to display the assets without using the Box i
221
203
  BoxView::Session.viewerjs_url
222
204
  ```
223
205
 
224
- <a name="viewer_url"/>
225
206
  #### Viewer URL
226
207
 
227
208
  The url used in the view method. Can be used in an iframe to display the converted document. Requires a `session_id`.
@@ -230,7 +211,6 @@ The url used in the view method. Can be used in an iframe to display the convert
230
211
  BoxView::Session.viewer_url
231
212
  ```
232
213
 
233
- <a name="supported_mimetypes"/>
234
214
  #### Supported MIMETypes
235
215
 
236
216
  Returns an array containing all the mimetypes that BoxView is known to support.
@@ -239,7 +219,6 @@ Returns an array containing all the mimetypes that BoxView is known to support.
239
219
  BoxView::Document.supported_mimetypes
240
220
  ```
241
221
 
242
- <a name="supported_file_extensions"/>
243
222
  #### Supported File Extensions
244
223
 
245
224
  Returns an array containing all the extensions of filetypes that BoxView is known to support.
@@ -248,7 +227,6 @@ Returns an array containing all the extensions of filetypes that BoxView is know
248
227
  BoxView::Document.supported_file_extensions
249
228
  ```
250
229
 
251
- <a name="contributing"/>
252
230
  ## Contributing
253
231
 
254
232
  1. Fork it ( https://github.com/[my-github-username]/boxviewrb/fork )
@@ -257,12 +235,10 @@ BoxView::Document.supported_file_extensions
257
235
  4. Push to the branch (`git push origin my-new-feature`)
258
236
  5. Create a new Pull Request
259
237
 
260
- <a name="author"/>
261
238
  ## Author
262
239
 
263
240
  Vincent Taverna, vinny@getlua.com, [vinnymac.github.io](http://vinnymac.github.io)
264
241
 
265
- <a name="license"/>
266
242
  ## License
267
243
 
268
244
  boxviewrb is available under the MIT license. See the [LICENSE](LICENSE.txt) file for more information.
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.6"
23
- spec.add_development_dependency "rake", "~> 0"
24
- spec.add_development_dependency "rspec", "~> 0"
25
- spec.add_runtime_dependency 'httmultiparty', "~> 0.3"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_runtime_dependency 'httmultiparty', '~> 0.3.14'
26
26
  end
@@ -7,6 +7,7 @@ module BoxView
7
7
  PATH = '/documents'
8
8
  ZIP = 'zip' # Constant for generating a zip of assets of a document
9
9
  PDF = 'pdf' # Constant for generating a pdf of a document
10
+ ORIGINAL_FORMAT = '' # Constant for fetching the original uploaded file
10
11
 
11
12
  class << self
12
13
 
@@ -39,7 +40,7 @@ module BoxView
39
40
  # Note:
40
41
  # => This method only accepts pdf or zip as types.
41
42
  def type=(type)
42
- raise BoxView::Errors::TypeNotFound if ![ZIP, PDF].include? type.downcase
43
+ raise BoxView::Errors::TypeNotFound if ![ZIP, PDF, ORIGINAL_FORMAT].include? type.downcase
43
44
  @type = type
44
45
  end
45
46
 
@@ -129,7 +130,7 @@ module BoxView
129
130
  # => Type, Document ID
130
131
  def assets(options = {})
131
132
  BoxView.document_id = options[:document_id] if options[:document_id]
132
- type = options[:type] if options[:type]
133
+ self.type = options[:type] if options[:type]
133
134
  response = BoxView.get asset_url, headers: BoxView.headers
134
135
  asset_response_handler response
135
136
  return response
@@ -187,7 +188,11 @@ module BoxView
187
188
  # => A Document ID must be defined.
188
189
  def asset_url
189
190
  type = if @type then @type else ZIP end # Defaults to ZIP
190
- "#{document_path}/#{BoxView.document_id}/content.#{type}"
191
+ rtn = "#{document_path}/#{BoxView.document_id}/content"
192
+ unless type == ORIGINAL_FORMAT
193
+ rtn += ".#{type}"
194
+ end
195
+ rtn
191
196
  end
192
197
 
193
198
  # Description: Params for retrieving a thumbnail of a certain size
@@ -241,6 +246,7 @@ module BoxView
241
246
  def delete_response_handler(response)
242
247
  case response.code
243
248
  when 200
249
+ when 204
244
250
  else
245
251
  raise BoxView::Errors::DocumentDeletionFailed.new(response)
246
252
  end
@@ -254,7 +260,7 @@ module BoxView
254
260
  case response.code
255
261
  when 200
256
262
  else
257
- raise BoxView::Errors::AssetGeneratioFailed.new(response)
263
+ raise BoxView::Errors::AssetGenerationFailed.new(response)
258
264
  end
259
265
  end
260
266
 
@@ -361,4 +367,4 @@ module BoxView
361
367
 
362
368
  end
363
369
  end
364
- end
370
+ end
@@ -37,9 +37,9 @@ module BoxView
37
37
  # => document id must be defined.
38
38
  def create(options = {})
39
39
  BoxView.document_id = options[:document_id] if options[:document_id]
40
- duration = options[:duration] if options[:duration]
41
- expiration_date = options[:expiration_date] if options[:expiration_date]
42
- is_downloadable = options[:is_downloadable] if options[:is_downloadable]
40
+ @duration = options[:duration] if options[:duration]
41
+ @expiration_date = options[:expiration_date] if options[:expiration_date]
42
+ @is_downloadable = options[:is_downloadable] if options[:is_downloadable]
43
43
  response = BoxView.post session_path, body: json_data, headers: BoxView.headers
44
44
  response_handler response
45
45
  return response
@@ -58,7 +58,7 @@ module BoxView
58
58
  # => Convenience method to make the session last for a thousand years
59
59
  # No Params!
60
60
  def never_expire
61
- expiration_date Time.now + (365.25 * 24 * 60 * 60 * 1000).to_i
61
+ @expiration_date = Time.now + (365.25 * 24 * 60 * 60 * 1000).to_i
62
62
  end
63
63
 
64
64
  # Description:
@@ -110,10 +110,10 @@ module BoxView
110
110
  case response.code
111
111
  when 201 # Done converting
112
112
  parsed = JSON.parse response.body
113
- session_id = parsed["id"]
114
- BoxView.session_id = session_id
113
+ @session_id = parsed["id"]
114
+ BoxView.session_id = @session_id
115
115
  when 202 # Session not ready yet
116
- retry_after response['Retry-After']
116
+ @retry_after = response.headers['retry-after']
117
117
  when 400 # An error occurred while converting the document or the document does not exist
118
118
  raise BoxView::Errors::DocumentConversionFailed
119
119
  else
@@ -141,4 +141,4 @@ module BoxView
141
141
  end
142
142
  end
143
143
  end
144
- end
144
+ end
@@ -1,3 +1,3 @@
1
1
  module BoxView
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -69,13 +69,23 @@ describe BoxView::Document, '#thumbnail_params' do
69
69
  end
70
70
  end
71
71
  describe BoxView::Document, '#create' do
72
+ let(:mock_response) { double('202 Response', { :code => 201, :body => '{"id": "123"}'}) }
73
+
74
+ before do
75
+ allow(BoxView).to receive(:post).and_return(mock_response)
76
+ end
77
+
72
78
  xit 'should raise when receiving a bad request' do
73
79
  end
74
80
 
75
- it 'should raise when receiving a bad api key' do
76
- BoxView.api_key = 'somesortofbadapikey'
77
- BoxView::Document.url = 'http://imgur.com/cats.jpeg'
78
- expect{BoxView::Document.create}.to raise_error(BoxView::Errors::DocumentIdNotGenerated)
81
+ context 'when receiving a bad api key' do
82
+ let(:mock_response) { double('401 Response', { :code => 401 }) }
83
+
84
+ it 'should raise' do
85
+ BoxView.api_key = 'somesortofbadapikey'
86
+ BoxView::Document.url = 'http://imgur.com/cats.jpeg'
87
+ expect{BoxView::Document.create}.to raise_error(BoxView::Errors::DocumentIdNotGenerated)
88
+ end
79
89
  end
80
90
 
81
91
  it 'should return the response when sent a good request (200..202)' do
@@ -84,4 +94,16 @@ describe BoxView::Document, '#create' do
84
94
  response = BoxView::Document.create
85
95
  expect(200..202).to cover(response.code)
86
96
  end
87
- end
97
+ end
98
+ describe BoxView::Document, '#delete' do
99
+ let(:mock_response) { double('204 Response', { :code => 204, :body => '' }) }
100
+
101
+ before do
102
+ allow(BoxView).to receive(:delete).and_return(mock_response)
103
+ end
104
+
105
+ it 'should return an empty string when sent a good request resulting in a 204 (empty) response' do
106
+ response = BoxView::Document.delete document_id: "xyz"
107
+ expect(response.body).to eq ''
108
+ end
109
+ end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe BoxView::Session, '#expiration_date' do
4
-
5
4
  it 'should raise error when expiration date is nil' do
6
5
  BoxView::Session.expiration_date = nil
7
6
  expect{BoxView::Session.expiration_date}.to raise_error(BoxView::Errors::ExpirationDateNotFound)
@@ -11,11 +10,9 @@ describe BoxView::Session, '#expiration_date' do
11
10
  BoxView::Session.expiration_date = Time.now
12
11
  expect(BoxView::Session.expiration_date).not_to be_nil
13
12
  end
14
-
15
13
  end
16
14
 
17
15
  describe BoxView::Session, '#duration' do
18
-
19
16
  it 'should raise error when duration is nil' do
20
17
  BoxView::Session.duration = nil
21
18
  expect{BoxView::Session.duration}.to raise_error(BoxView::Errors::DurationNotFound)
@@ -25,5 +22,19 @@ describe BoxView::Session, '#duration' do
25
22
  BoxView::Session.duration = 100
26
23
  expect(BoxView::Session.duration).not_to be_nil
27
24
  end
25
+ end
26
+
27
+ describe BoxView::Session, '#create' do
28
+ before do
29
+ allow(BoxView).to receive(:post).and_return(mock_response)
30
+ end
28
31
 
32
+ context 'when response is 202' do
33
+ let(:mock_response) { double('202 Response', { :code => 202, :headers => { 'retry-after' => '2' }, }) }
34
+
35
+ it 'should set retry_after' do
36
+ BoxView::Session.create({ :document_id => '123'})
37
+ expect(BoxView::Session.retry_after).to eql('2')
38
+ end
39
+ end
29
40
  end
@@ -1,5 +1,5 @@
1
1
  require 'boxview'
2
2
 
3
- API_KEY = ENV["BOXVIEW_APIKEY"]
3
+ API_KEY = ENV["BOXVIEW_APIKEY"] || "123"
4
4
 
5
5
  # ToDo: Stub HTTParty Responses using https://github.com/bblimke/webmock/
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boxview.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincent Taverna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-08 00:00:00.000000000 Z
11
+ date: 2015-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,28 +28,28 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '0.3'
61
+ version: 0.3.14
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: '0.3'
68
+ version: 0.3.14
69
69
  description: Box View converts PDF and Office documents to HTML thus enabling these
70
70
  files to be easily embedded into web and mobile applications.
71
71
  email: