You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					162 lines
				
				5.6 KiB
			
		
		
			
		
	
	
					162 lines
				
				5.6 KiB
			| 
											2 years ago
										 | # Container File Blobs
 | ||
|  | 
 | ||
|  | Pure JS implementation of various container file formats, including ZIP and CFB. | ||
|  | 
 | ||
|  | [](https://travis-ci.org/SheetJS/js-cfb) | ||
|  | [](https://coveralls.io/r/SheetJS/js-cfb?branch=master) | ||
|  | [](https://david-dm.org/sheetjs/js-cfb) | ||
|  | [](https://npmjs.org/package/cfb) | ||
|  | [](https://github.com/SheetJS/js-cfb) | ||
|  | 
 | ||
|  | ## Installation
 | ||
|  | 
 | ||
|  | In the browser: | ||
|  | 
 | ||
|  | ```html | ||
|  | <script src="dist/cfb.min.js" type="text/javascript"></script> | ||
|  | ``` | ||
|  | 
 | ||
|  | With [npm](https://www.npmjs.org/package/cfb): | ||
|  | 
 | ||
|  | ```bash | ||
|  | $ npm install cfb | ||
|  | ``` | ||
|  | 
 | ||
|  | The `xlscfb.js` file is designed to be embedded in [js-xlsx](http://git.io/xlsx) | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Library Usage
 | ||
|  | 
 | ||
|  | In node: | ||
|  | 
 | ||
|  | ```js | ||
|  | var CFB = require('cfb'); | ||
|  | ``` | ||
|  | 
 | ||
|  | For example, to get the Workbook content from an Excel 2003 XLS file: | ||
|  | 
 | ||
|  | ```js | ||
|  | var cfb = CFB.read(filename, {type: 'file'}); | ||
|  | var workbook = CFB.find(cfb, 'Workbook'); | ||
|  | var data = workbook.content; | ||
|  | ``` | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Command-Line Utility Usage
 | ||
|  | 
 | ||
|  | The [`cfb-cli`](https://www.npmjs.com/package/cfb-cli) module ships with a CLI | ||
|  | tool for manipulating and inspecting supported files. | ||
|  | 
 | ||
|  | 
 | ||
|  | ## JS API
 | ||
|  | 
 | ||
|  | TypeScript definitions are maintained in `types/index.d.ts`. | ||
|  | 
 | ||
|  | The CFB object exposes the following methods and properties: | ||
|  | 
 | ||
|  | `CFB.parse(blob)` takes a nodejs Buffer or an array of bytes and returns an | ||
|  | parsed representation of the data. | ||
|  | 
 | ||
|  | `CFB.read(blob, opts)` wraps `parse`. | ||
|  | 
 | ||
|  | `CFB.find(cfb, path)` performs a case-insensitive match for the path (or file | ||
|  | name, if there are no slashes) and returns an entry object or null if not found. | ||
|  | 
 | ||
|  | `CFB.write(cfb, opts)` generates a file based on the container. | ||
|  | 
 | ||
|  | `CFB.writeFile(cfb, filename, opts)` creates a file with the specified name. | ||
|  | 
 | ||
|  | ### Parse Options
 | ||
|  | 
 | ||
|  | `CFB.read` takes an options argument.  `opts.type` controls the behavior: | ||
|  | 
 | ||
|  | | `type`     | expected input                                                  | | ||
|  | |------------|:----------------------------------------------------------------| | ||
|  | | `"base64"` | string: Base64 encoding of the file                             | | ||
|  | | `"binary"` | string: binary string (byte `n` is `data.charCodeAt(n)`)        | | ||
|  | | `"buffer"` | nodejs Buffer                                                   | | ||
|  | | `"file"`   | string: path of file that will be read (nodejs only)            | | ||
|  | | (default)  | buffer or array of 8-bit unsigned int (byte `n` is `data[n]`)   | | ||
|  | 
 | ||
|  | 
 | ||
|  | ### Write Options
 | ||
|  | 
 | ||
|  | `CFB.write` and `CFB.writeFile` take options argument. | ||
|  | 
 | ||
|  | `opts.type` controls the behavior: | ||
|  | 
 | ||
|  | | `type`     | output                                                          | | ||
|  | |------------|:----------------------------------------------------------------| | ||
|  | | `"base64"` | string: Base64 encoding of the file                             | | ||
|  | | `"binary"` | string: binary string (byte `n` is `data.charCodeAt(n)`)        | | ||
|  | | `"buffer"` | nodejs Buffer                                                   | | ||
|  | | `"file"`   | string: path of file that will be created (nodejs only)         | | ||
|  | | (default)  | buffer if available, array of 8-bit unsigned int otherwise      | | ||
|  | 
 | ||
|  | `opts.fileType` controls the output file type: | ||
|  | 
 | ||
|  | | `fileType`         | output                  | | ||
|  | |:-------------------|:------------------------| | ||
|  | | `'cfb'` (default)  | CFB container           | | ||
|  | | `'zip'`            | ZIP file                | | ||
|  | | `'mad'`            | MIME aggregate document | | ||
|  | 
 | ||
|  | `opts.compression` enables DEFLATE compression for ZIP file type. | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Utility Functions
 | ||
|  | 
 | ||
|  | The utility functions are available in the `CFB.utils` object.  Functions that | ||
|  | accept a `name` argument strictly deal with absolute file names: | ||
|  | 
 | ||
|  | - `.cfb_new(?opts)` creates a new container object. | ||
|  | - `.cfb_add(cfb, name, ?content, ?opts)` adds a new file to the `cfb`. | ||
|  |   Set the option `{unsafe:true}` to skip existence checks (for bulk additions) | ||
|  | - `.cfb_del(cfb, name)` deletes the specified file | ||
|  | - `.cfb_mov(cfb, old_name, new_name)` moves the old file to new path and name | ||
|  | - `.use_zlib(require("zlib"))` loads a nodejs `zlib` instance. | ||
|  | 
 | ||
|  | By default, the library uses a pure JS inflate/deflate implementation.  NodeJS | ||
|  | `zlib.InflateRaw` exposes the number of bytes read in versions after `8.11.0`. | ||
|  | If a supplied `zlib` does not support the required features, a warning will be | ||
|  | displayed in the console and the pure JS fallback will be used. | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Container Object Description
 | ||
|  | 
 | ||
|  | The objects returned by `parse` and `read` have the following properties: | ||
|  | 
 | ||
|  | - `.FullPaths` is an array of the names of all of the streams (files) and | ||
|  |   storages (directories) in the container.  The paths are properly prefixed from | ||
|  |   the root entry (so the entries are unique) | ||
|  | 
 | ||
|  | - `.FileIndex` is an array, in the same order as `.FullPaths`, whose values are | ||
|  |   objects following the schema: | ||
|  | 
 | ||
|  | ```typescript | ||
|  | interface CFBEntry { | ||
|  |   name: string; /** Case-sensitive internal name */ | ||
|  |   type: number; /** 1 = dir, 2 = file, 5 = root ; see [MS-CFB] 2.6.1 */ | ||
|  |   content: Buffer | number[] | Uint8Array; /** Raw Content */ | ||
|  |   ct?: Date; /** Creation Time */ | ||
|  |   mt?: Date; /** Modification Time */ | ||
|  |   ctype?: String; /** Content-Type (for MAD) */ | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | 
 | ||
|  | ## License
 | ||
|  | 
 | ||
|  | Please consult the attached LICENSE file for details.  All rights not explicitly | ||
|  | granted by the Apache 2.0 License are reserved by the Original Author. | ||
|  | 
 | ||
|  | 
 | ||
|  | ## References
 | ||
|  | 
 | ||
|  |  - `MS-CFB`: Compound File Binary File Format | ||
|  |  - ZIP `APPNOTE.TXT`: .ZIP File Format Specification | ||
|  |  - RFC1951: https://www.ietf.org/rfc/rfc1951.txt | ||
|  |  - RFC2045: https://www.ietf.org/rfc/rfc2045.txt | ||
|  |  - RFC2557: https://www.ietf.org/rfc/rfc2557.txt | ||
|  | 
 |