diff --git a/html_manual/README.txt b/html_manual/README.txt
index 2c24f7b..7fab7eb 100644
--- a/html_manual/README.txt
+++ b/html_manual/README.txt
@@ -1,3 +1,5 @@
-The splits and pysplits are just copied from the parent directory - remember to update them.
+The splits and pysplits and dotnetsplits are just copied from the parent
+directory - remember to update them.
-When we make command line / C / Python we upload it in subdirectory.
+When we make command line / C / Python / .NET we upload it in a named
+subdirectory.
diff --git a/html_manual/dotnetsplits/c00.tex b/html_manual/dotnetsplits/c00.tex
new file mode 100644
index 0000000..c3d5c8f
--- /dev/null
+++ b/html_manual/dotnetsplits/c00.tex
@@ -0,0 +1,24 @@
+Cpdf
+
+The Coherent PDF Library for .NET
+
+Cpdf.Pdf
+
+PDF document. Use the 'using' keyword, or call Dispose to make sure PDFs are
+deallocated.
+
+Cpdf.Pdf.Dispose
+
+Force disposal of the PDF.
+
+Cpdf.Pdf.Finalize
+
+Class destructor
+
+Cpdf.CPDFError
+
+Any function in this library may raise the CPDFError exception.
+
+Cpdf.CPDFError.#ctor(String)
+
+Construct a CPDFError which carries a string.
diff --git a/html_manual/dotnetsplits/c01.tex b/html_manual/dotnetsplits/c01.tex
new file mode 100644
index 0000000..be10f5a
--- /dev/null
+++ b/html_manual/dotnetsplits/c01.tex
@@ -0,0 +1,39 @@
+CHAPTER 0. Preliminaries
+
+Cpdf.startup
+
+Initialises the library. Must be called before any other function.
+
+Cpdf.version
+
+Returns a string giving the version number of the CPDF library.
+
+Cpdf.setFast
+
+Some operations have a fast mode. The default is 'slow' mode, which works even
+on old-fashioned files. For more details, see section 1.13 of the CPDF manual.
+This function sets the mode to fast globally.
+
+Cpdf.setSlow
+
+Some operations have a fast mode. The default is 'slow' mode, which works even
+on old-fashioned files. For more details, see section 1.13 of the CPDF manual.
+This functions sets the mode to slow globally.
+
+Cpdf.lastError
+
+Not to be called directly. Errors in .NET cpdf are raised by exceptions.
+
+Cpdf.lastErrorString
+
+Not to be called directly. Errors in .NET cpdf are raised by exceptions.
+
+Cpdf.clearError
+
+Not to be called directly. Errors in .NET cpdf are raised by exceptions.
+
+Cpdf.onExit
+
+A debug function which prints some information about resource usage. This can
+be used to detect if PDFs or ranges are being deallocated properly. Contrary to
+its name, it may be run at any time.
diff --git a/html_manual/dotnetsplits/c02.tex b/html_manual/dotnetsplits/c02.tex
new file mode 100644
index 0000000..05b0224
--- /dev/null
+++ b/html_manual/dotnetsplits/c02.tex
@@ -0,0 +1,266 @@
+CHAPTER 1. Basics
+
+Cpdf.fromFile(String, String)
+
+Loads a PDF file from a given file. Supply a user password (possibly blank) in
+case the file is encrypted. It won't be decrypted, but sometimes the password
+is needed just to load the file.
+
+Cpdf.fromFileLazy(String, String)
+
+Loads a PDF from a file, doing only minimal parsing. The objects will be read
+and parsed when they are actually needed. Use this when the whole file won't be
+required. Also supply a user password (possibly blank) in case the file is
+encrypted. It won't be decrypted, but sometimes the password is needed just to
+load the file.
+
+Cpdf.fromMemory(Byte[], String)
+
+Loads a file from memory given any user password.
+
+Cpdf.fromMemoryLazy(IntPtr, Int32, String)
+
+Loads a file from memory, given a pointer and a length, and the user password,
+but lazily like fromFileLazy. The caller must use AllocHGlobal / Marshal.Copy /
+FreeHGlobal itself. It must not free the memory until the PDF is also gone.
+
+Cpdf.startEnumeratePDFs
+
+Cpdf.enumeratePDFsKey(Int32)
+
+Cpdf.enumeratePDFsInfo(Int32)
+
+Cpdf.endEnumeratePDFs
+
+To enumerate the list of currently allocated PDFs, call startEnumeratePDFs
+which gives the number, n, of PDFs allocated, then enumeratePDFsInfo and
+enumeratePDFsKey with index numbers from 0...(n - 1). Call endEnumeratePDFs to
+clean up.
+
+Cpdf.ptOfCm(Double)
+
+Converts a figure in centimetres to points (72 points to 1 inch)
+
+Cpdf.ptOfMm(Double)
+
+Converts a figure in millimetres to points (72 points to 1 inch)
+
+Cpdf.ptOfIn(Double)
+
+Converts a figure in inches to points (72 points to 1 inch)
+
+Cpdf.cmOfPt(Double)
+
+Converts a figure in points to centimetres (72 points to 1 inch)
+
+Cpdf.mmOfPt(Double)
+
+Converts a figure in points to millimetres (72 points to 1 inch)
+
+Cpdf.inOfPt(Double)
+
+Converts a figure in points to inches (72 points to 1 inch)
+
+Cpdf.parsePagespec(Cpdf.Pdf, String)
+
+Parses a page specification with reference to a given PDF (the PDF is supplied
+so that page ranges which reference pages which do not exist are rejected).
+
+Cpdf.validatePagespec(String)
+
+Validates a page specification so far as is possible in the absence of the
+actual document. Result is true if valid.
+
+Cpdf.stringOfPagespec(Cpdf.Pdf, List{Int32})
+
+Builds a page specification from a page range. For example, the range
+containing 1, 2, 3, 6, 7, 8 in a document of 8 pages might yield "1-3, 6-end"
+
+Cpdf.blankRange
+
+Creates a range with no pages in.
+
+Cpdf.range(Int32, Int32)
+
+Builds a range from one page to another inclusive. For example, range(3, 7)
+gives the range 3, 4, 5, 6, 7
+
+Cpdf.all(Cpdf.Pdf)
+
+The range containing all the pages in a given document.
+
+Cpdf.even(List{Int32})
+
+Makes a range which contains just the even pages of another range.
+
+Cpdf.odd(List{Int32})
+
+Makes a range which contains just the odd pages of another range.
+
+Cpdf.rangeUnion(List{Int32}, List{Int32})
+
+Makes the union of two ranges giving a range containing the pages in range a
+and range b.
+
+Cpdf.difference(List{Int32}, List{Int32})
+
+Makes the difference of two ranges, giving a range containing all the pages in
+a except for those which are also in b.
+
+Cpdf.removeDuplicates(List{Int32})
+
+Deduplicates a range, making a new one.
+
+Cpdf.rangeLength(List{Int32})
+
+Gives the number of pages in a range.
+
+Cpdf.rangeGet(List{Int32}, Int32)
+
+Gets the page number at position n in a range,
+where n runs from 0 to rangeLength - 1.
+
+Cpdf.rangeAdd(List{Int32}, Int32)
+
+Adds the page to a range, if it is not already
+there.
+
+Cpdf.isInRange(List{Int32}, Int32)
+
+Returns true if the page is in the range,
+false otherwise.
+
+Cpdf.pages(Cpdf.Pdf)
+
+Returns the number of pages in a PDF.
+
+Cpdf.pagesFast(String, String)
+
+Returns the number of pages in a given PDF, with given user password. It tries
+to do this as fast as possible, without loading the whole file.
+
+Cpdf.toFile(Cpdf.Pdf, String, Boolean, Boolean)
+
+Writes the file to a given filename. If linearize is true, it will be
+linearized if a linearizer is available. If make_id is true, it will be given a
+new ID.
+
+Cpdf.toFileExt(Cpdf.Pdf, String, Boolean, Boolean, Boolean, Boolean, Boolean)
+
+Writes the file to a given filename. If make_id is true, it will be given a new
+ID. If preserve_objstm is true, existing object streams will be preserved. If
+generate_objstm is true, object streams will be generated even if not
+originally present. If compress_objstm is true, object streams will be
+compressed (what we usually want). WARNING: the pdf argument will be invalid
+after this call, and should be not be used again.
+
+Cpdf.toMemory(Cpdf.Pdf, Boolean, Boolean)
+
+Writes a PDF file and returns as an array of bytes.
+
+Cpdf.isEncrypted(Cpdf.Pdf)
+
+Returns true if a documented is encrypted, false otherwise.
+
+Cpdf.decryptPdf(Cpdf.Pdf, String)
+
+Attempts to decrypt a PDF using the given user password. An exception is raised
+if the decryption fails.
+
+Cpdf.decryptPdfOwner(Cpdf.Pdf, String)
+
+Attempts to decrypt a PDF using the given owner password. Raises an exception
+if the decryption fails.
+
+Cpdf.Permission
+
+Permissions
+
+Cpdf.Permission.NoEdit
+
+Cannot edit the document
+
+Cpdf.Permission.NoPrint
+
+Cannot print the document
+
+Cpdf.Permission.NoCopy
+
+Cannot copy the document
+
+Cpdf.Permission.NoAnnot
+
+Cannot annotate the document
+
+Cpdf.Permission.NoForms
+
+Cannot edit forms in the document
+
+Cpdf.Permission.NoExtract
+
+Cannot extract information
+
+Cpdf.Permission.NoAssemble
+
+Cannot assemble into a bigger document
+
+Cpdf.Permission.NoHqPrint
+
+Cannot print high quality
+
+Cpdf.EncryptionMethod
+
+Encryption methods
+
+Cpdf.EncryptionMethod.Pdf40bit
+
+40 bit RC4 encryption
+
+Cpdf.EncryptionMethod.Pdf128bit
+
+128 bit RC4 encryption
+
+Cpdf.EncryptionMethod.Aes128bitfalse
+
+128 bit AES encryption, do not encrypt metadata
+
+Cpdf.EncryptionMethod.Aes128bittrue
+
+128 bit AES encryption, encrypt metadata
+
+Cpdf.EncryptionMethod.Aes256bitfalse
+
+Deprecated. Do not use for new files
+
+Cpdf.EncryptionMethod.Aes256bittrue
+
+Deprecated. Do not use for new files
+
+Cpdf.EncryptionMethod.Aes256bitisofalse
+
+256 bit AES encryption, do not encrypt metadata
+
+Cpdf.EncryptionMethod.Aes256bitiosotrue
+
+256 bit AES encryption, encrypt metadata
+
+Cpdf.toFileEncrypted(Cpdf.Pdf, Cpdf.EncryptionMethod, List{Cpdf.Permission},
+String, String, Boolean, Boolean, String)
+
+Writes a file as encrypted.
+
+Cpdf.toFileEncryptedExt(Cpdf.Pdf, Cpdf.EncryptionMethod, List{Cpdf.Permission},
+String, String, Boolean, Boolean, Boolean, Boolean, Boolean, String)
+
+Writes a file as encrypted with extra parameters. WARNING: the pdf argument
+will be invalid after this call, and should not be used again.
+
+Cpdf.hasPermission(Cpdf.Pdf, Cpdf.Permission)
+
+Returns true if the given permission
+(restriction) is present.
+
+Cpdf.encryptionKind(Cpdf.Pdf)
+
+Returns the encryption method currently in use on
+a document.
diff --git a/html_manual/dotnetsplits/c03.tex b/html_manual/dotnetsplits/c03.tex
new file mode 100644
index 0000000..b730467
--- /dev/null
+++ b/html_manual/dotnetsplits/c03.tex
@@ -0,0 +1,22 @@
+CHAPTER 2. Merging and Splitting
+
+Cpdf.mergeSimple(List{Cpdf.Pdf})
+
+Given a list of PDFs, merges the files into a new one, which is returned.
+
+Cpdf.merge(List{Cpdf.Pdf}, Boolean, Boolean)
+
+Merges the PDFs. If retain_numbering is true page labels are not rewritten. If
+remove_duplicate_fonts is true, duplicate fonts are merged. This is useful when
+the source documents for merging originate from the same source.
+
+Cpdf.mergeSame(List{Cpdf.Pdf}, Boolean, Boolean, List{List{Int32}})
+
+The same as merge, except that it has an additional argument - a list of page
+ranges. This is used to select the pages to pick from each PDF. This avoids
+duplication of information when multiple discrete parts of a source PDF are
+included.
+
+Cpdf.selectPages(Cpdf.Pdf, List{Int32})
+
+Returns a new document which just those pages in the page range.
diff --git a/html_manual/dotnetsplits/c04.tex b/html_manual/dotnetsplits/c04.tex
new file mode 100644
index 0000000..765c883
--- /dev/null
+++ b/html_manual/dotnetsplits/c04.tex
@@ -0,0 +1,235 @@
+CHAPTER 3. Pages
+
+Cpdf.scalePages(Cpdf.Pdf, List{Int32}, Double, Double)
+
+Scales the page dimensions and content by the given scale, about (0, 0). Other
+boxes (crop etc. are altered as appropriate)
+
+Cpdf.scaleToFit(Cpdf.Pdf, List{Int32}, Double, Double, Double)
+
+Scales the content to fit new page dimensions (width x height) multiplied by
+scale (typically 1.0). Other boxes (crop etc. are altered as appropriate)
+
+Cpdf.Papersize
+
+Built-in paper sizes
+
+Cpdf.Papersize.A0portrait
+
+A0 Portrait paper
+
+Cpdf.Papersize.A1portrait
+
+A1 Portrait paper
+
+Cpdf.Papersize.A2portrait
+
+A2 Portrait paper
+
+Cpdf.Papersize.A3portrait
+
+A3 Portrait paper
+
+Cpdf.Papersize.A4portrait
+
+A4 Portrait paper
+
+Cpdf.Papersize.A5portrait
+
+A5 Portrait paper
+
+Cpdf.Papersize.A0landscape
+
+A0 Landscape paper
+
+Cpdf.Papersize.A1landscape
+
+A1 Landscape paper
+
+Cpdf.Papersize.A2landscape
+
+A2 Landscape paper
+
+Cpdf.Papersize.A3landscape
+
+A3 Landscape paper
+
+Cpdf.Papersize.A4landscape
+
+A4 Landscape paper
+
+Cpdf.Papersize.A5landscape
+
+A5 Landscape paper
+
+Cpdf.Papersize.Usletterportrait
+
+US Letter Portrait paper
+
+Cpdf.Papersize.Usletterlandscape
+
+US Letter Landscape paper
+
+Cpdf.Papersize.Uslegalportrait
+
+US Legal Portrait paper
+
+Cpdf.Papersize.Uslegallandscape
+
+US Legal Landscape paper
+
+Cpdf.scaleToFitPaper(Cpdf.Pdf, List{Int32}, Cpdf.Papersize, Double)
+
+Scales the page content to fit the given page size, possibly multiplied by
+scale (typically 1.0)
+
+Cpdf.Anchor
+
+Position anchors
+
+Cpdf.Anchor.PosCentre
+
+Absolute centre
+
+Cpdf.Anchor.PosLeft
+
+Absolute left
+
+Cpdf.Anchor.PosRight
+
+Absolute right
+
+Cpdf.Anchor.Top
+
+The top centre of the page
+
+Cpdf.Anchor.TopLeft
+
+The top left of the page
+
+Cpdf.Anchor.TopRight
+
+The top right of the page
+
+Cpdf.Anchor.Left
+
+The left hand side of the page, halfway down
+
+Cpdf.Anchor.BottomLeft
+
+The bottom left of the page
+
+Cpdf.Anchor.Bottom
+
+The bottom middle of the page
+
+Cpdf.Anchor.BottomRight
+
+The bottom right of the page
+
+Cpdf.Anchor.Right
+
+The right hand side of the page, halfway down
+
+Cpdf.Anchor.Diagonal
+
+Diagonal, bottom left to top right
+
+Cpdf.Anchor.ReverseDiagonal
+
+Diagonal, top left to bottom right
+
+Cpdf.Position
+
+Cpdf.Position.anchor
+
+Position anchor
+
+Cpdf.Position.coord1
+
+Parameter one
+
+Cpdf.Position.coord2
+
+Parameter two
+
+Cpdf.Position.#ctor(Cpdf.Anchor)
+
+Build a position with zero parameters
+
+Cpdf.Position.#ctor(Cpdf.Anchor, Double)
+
+Build a position with one parameter
+
+Cpdf.Position.#ctor(Cpdf.Anchor, Double, Double)
+
+Build a position with two parameters
+
+Cpdf.scaleContents(Cpdf.Pdf, List{Int32}, Cpdf.Position, Double)
+
+Scales the contents of the pages in the range about the point given by the
+position, by the scale given.
+
+Cpdf.shiftContents(Cpdf.Pdf, List{Int32}, Double, Double)
+
+Shifts the content of the pages in the range.
+
+Cpdf.rotate(Cpdf.Pdf, List{Int32}, Int32)
+
+Changes the viewing rotation to an absolute value. Appropriate rotations are 0,
+90, 180, 270.
+
+Cpdf.rotateBy(Cpdf.Pdf, List{Int32}, Int32)
+
+Rotates the content about the centre of the page by the given number of
+degrees, in a clockwise direction.
+
+Cpdf.rotateContents(Cpdf.Pdf, List{Int32}, Double)
+
+Rotates the content about the centre of the page by the given number of
+degrees, in a clockwise direction.
+
+Cpdf.upright(Cpdf.Pdf, List{Int32})
+
+Changes the viewing rotation of the pages in the range, counter-rotating the
+dimensions and content such that there is no visual change.
+
+Cpdf.hFlip(Cpdf.Pdf, List{Int32})
+
+Flips horizontally the pages in the range.
+
+Cpdf.vFlip(Cpdf.Pdf, List{Int32})
+
+Flips vertically the pages in the range.
+
+Cpdf.crop(Cpdf.Pdf, List{Int32}, Double, Double, Double, Double)
+
+Crops a page, replacing any existing crop box. The dimensions are in points.
+
+Cpdf.removeCrop(Cpdf.Pdf, List{Int32})
+
+Removes any crop box from pages in the range.
+
+Cpdf.removeTrim(Cpdf.Pdf, List{Int32})
+
+Removes any trim box from pages in the range.
+
+Cpdf.removeArt(Cpdf.Pdf, List{Int32})
+
+Removes any art box from pages in the range.
+
+Cpdf.removeBleed(Cpdf.Pdf, List{Int32})
+
+Removes any bleed box from pages in the range.
+
+Cpdf.trimMarks(Cpdf.Pdf, List{Int32})
+
+Adds trim marks to the given pages, if the trimbox exists.
+
+Cpdf.showBoxes(Cpdf.Pdf, List{Int32})
+
+Shows the boxes on the given pages, for debug.
+
+Cpdf.hardBox(Cpdf.Pdf, List{Int32}, String)
+
+Makes a given box a 'hard box' i.e clips it explicitly.
diff --git a/html_manual/dotnetsplits/c05.tex b/html_manual/dotnetsplits/c05.tex
new file mode 100644
index 0000000..72fb05e
--- /dev/null
+++ b/html_manual/dotnetsplits/c05.tex
@@ -0,0 +1,3 @@
+CHAPTER 4. Encryption
+
+Encryption covered in Chapter 1.
diff --git a/html_manual/dotnetsplits/c06.tex b/html_manual/dotnetsplits/c06.tex
new file mode 100644
index 0000000..27d0a0f
--- /dev/null
+++ b/html_manual/dotnetsplits/c06.tex
@@ -0,0 +1,14 @@
+CHAPTER 5. Compression
+
+Cpdf.compress(Cpdf.Pdf)
+
+Compresses any uncompressed streams in the given PDF using the Flate algorithm.
+
+Cpdf.decompress(Cpdf.Pdf)
+
+Decompresses any streams in the given PDF, so long as the compression method is
+supported.
+
+Cpdf.squeezeInMemory(Cpdf.Pdf)
+
+Squeezes a pdf in memory.
diff --git a/html_manual/dotnetsplits/c07.tex b/html_manual/dotnetsplits/c07.tex
new file mode 100644
index 0000000..d3549f6
--- /dev/null
+++ b/html_manual/dotnetsplits/c07.tex
@@ -0,0 +1,68 @@
+CHAPTER 6. Bookmarks
+
+Cpdf.startGetBookmarkInfo(Cpdf.Pdf)
+
+Starts the bookmark retrieval process for a given PDF.
+
+Cpdf.numberBookmarks
+
+Gets the number of bookmarks for the PDF given to startGetBookmarkInfo.
+
+Cpdf.getBookmarkLevel(Int32)
+
+Gets the bookmark level for the given bookmark (0...(n - 1)).
+
+Cpdf.getBookmarkPage(Cpdf.Pdf, Int32)
+
+Gets the bookmark target page for the given PDF (which must be the same as the
+PDF passed to startSetBookmarkInfo) and bookmark (0...(n - 1)).
+
+Cpdf.getBookmarkText(Int32)
+
+Returns the text of bookmark (0...(n - 1)).
+
+Cpdf.getBookmarkOpenStatus(Int32)
+
+True if the bookmark is open.
+
+Cpdf.endGetBookmarkInfo
+
+Ends the bookmark retrieval process, cleaning up.
+
+Cpdf.startSetBookmarkInfo(Int32)
+
+Starts the bookmark setting process for n bookmarks.
+
+Cpdf.setBookmarkLevel(Int32, Int32)
+
+Set bookmark level for the given bookmark (0...(n - 1)).
+
+Cpdf.setBookmarkPage(Cpdf.Pdf, Int32, Int32)
+
+Sets the bookmark target page for the given PDF (which must be the same as the
+PDF to be passed to endSetBookmarkInfo) and bookmark (0...(n - 1)).
+
+Cpdf.setBookmarkOpenStatus(Int32, Boolean)
+
+Sets the open status of bookmark (0...(n - 1)).
+
+Cpdf.setBookmarkText(Int32, String)
+
+Sets the text of bookmark (0...(n - 1)).
+
+Cpdf.endSetBookmarkInfo(Cpdf.Pdf)
+
+Ends the bookmark setting process, writing the bookmarks to the given PDF.
+
+Cpdf.getBookmarksJSON(Cpdf.Pdf)
+
+Returns the bookmark data in JSON format.
+
+Cpdf.setBookmarksJSON(Cpdf.Pdf, Byte[])
+
+Sets the bookmarks from JSON bookmark data.
+
+Cpdf.tableOfContents(Cpdf.Pdf, Cpdf.Font, Double, String, Boolean)
+
+Typesets a table of contents from existing bookmarks and prepends it to the
+document. If bookmark is set, the table of contents gets its own bookmark.
diff --git a/html_manual/dotnetsplits/c08.tex b/html_manual/dotnetsplits/c08.tex
new file mode 100644
index 0000000..9b5c52e
--- /dev/null
+++ b/html_manual/dotnetsplits/c08.tex
@@ -0,0 +1,3 @@
+CHAPTER 7. Presentations
+
+Not included in the library version of cpdf.
diff --git a/html_manual/dotnetsplits/c09.tex b/html_manual/dotnetsplits/c09.tex
new file mode 100644
index 0000000..d1c6dbe
--- /dev/null
+++ b/html_manual/dotnetsplits/c09.tex
@@ -0,0 +1,123 @@
+CHAPTER 8. Logos, Watermarks and Stamps
+
+Cpdf.stampOn(Cpdf.Pdf, Cpdf.Pdf, List{Int32})
+
+Stamps stamp_pdf on top of all the pages in the document which are in the
+range. The stamp is placed with its origin at the origin of the target
+document.
+
+Cpdf.stampUnder(Cpdf.Pdf, Cpdf.Pdf, List{Int32})
+
+Stamps stamp_pdf under all the pages in the document which are in the range.
+The stamp is placed with its origin at the origin of the target document.
+
+Cpdf.stampExtended(Cpdf.Pdf, Cpdf.Pdf, List{Int32}, Boolean, Boolean,
+Cpdf.Position, Boolean)
+
+A stamping function with extra features. - isover true, pdf goes over pdf2,
+isover false, pdf goes under pdf2 - scale_stamp_to_fit scales the stamp to fit
+the page - pos gives the position to put the stamp - relative_to_cropbox: if
+true, pos is relative to cropbox not mediabox.
+
+Cpdf.combinePages(Cpdf.Pdf, Cpdf.Pdf)
+
+Combines the PDFs page-by-page, putting each page of 'over' over each page of
+'under'.
+
+Cpdf.Font
+
+Standard fonts
+
+Cpdf.Font.TimesRoman
+
+Times Roman
+
+Cpdf.Font.TimesBold
+
+Times Bold
+
+Cpdf.Font.TimesItalic
+
+Times Italic
+
+Cpdf.Font.TimesBoldItalic
+
+Times Bold Italic
+
+Cpdf.Font.Helvetica
+
+Helvetica
+
+Cpdf.Font.HelveticaBold
+
+Helvetica Bold
+
+Cpdf.Font.HelveticaOblique
+
+Helvetica Oblique
+
+Cpdf.Font.HelveticaBoldOblique
+
+Helvetica Bold Oblique
+
+Cpdf.Font.Courier
+
+Courier
+
+Cpdf.Font.CourierBold
+
+Courier Bold
+
+Cpdf.Font.CourierOblique
+
+Courier Oblique
+
+Cpdf.Font.CourierBoldOblique
+
+Courier Bold Oblique
+
+Cpdf.Justification
+
+Justifications
+
+Cpdf.Justification.LeftJustify
+
+Left justify
+
+Cpdf.Justification.CentreJustify
+
+Centre justify
+
+Cpdf.Justification.RightJustify
+
+Right justify
+
+Cpdf.addText(Boolean, Cpdf.Pdf, List{Int32}, String, Cpdf.Position, Double,
+Int32, Cpdf.Font, Double, Double, Double, Double, Boolean, Boolean, Boolean,
+Double, Cpdf.Justification, Boolean, Boolean, String, Double, Boolean)
+
+Adds text to the pages in the given range.
+
+Cpdf.addTextSimple(Cpdf.Pdf, List{Int32}, String, Cpdf.Position, Cpdf.Font,
+Double)
+
+Adds text with most parameters default.
+
+Cpdf.removeText(Cpdf.Pdf, List{Int32})
+
+Removes any text added by cpdf from the given pages.
+
+Cpdf.textWidth(Cpdf.Font, String)
+
+Returns the width of a given string in the given font in thousandths of a
+point.
+
+Cpdf.addContent(String, Boolean, Cpdf.Pdf, List{Int32})
+
+Adds page content before (if true) or after (if false) the existing content to
+pages in the given range in the given PDF.
+
+Cpdf.stampAsXObject(Cpdf.Pdf, List{Int32}, Cpdf.Pdf)
+
+Stamps stamp_pdf onto the pages in the given range in pdf as a shared Form
+XObject. The name of the newly-created XObject is returned.
diff --git a/html_manual/dotnetsplits/c10.tex b/html_manual/dotnetsplits/c10.tex
new file mode 100644
index 0000000..99b601a
--- /dev/null
+++ b/html_manual/dotnetsplits/c10.tex
@@ -0,0 +1,40 @@
+CHAPTER 9. Multipage facilities
+
+Cpdf.impose(Cpdf.Pdf, Double, Double, Boolean, Boolean, Boolean, Boolean,
+Boolean, Double, Double, Double)
+
+Imposes a PDF. There are two modes: imposing x * y, or imposing to fit a page
+of size x * y. This is controlled by fit. Columns imposes by columns rather
+than rows. rtl is right-to-left, btt bottom-to-top. Center is unused for now.
+Margin is the margin around the output, spacing the spacing between imposed
+inputs.
+
+Cpdf.twoUp(Cpdf.Pdf)
+
+Imposes a document two up. twoUpStack does so by doubling the page size, to fit
+two pages on one.
+
+Cpdf.twoUpStack(Cpdf.Pdf)
+
+Impose a document two up. twoUpStack does so by doubling the page size, to fit
+two pages on one.
+
+Cpdf.padBefore(Cpdf.Pdf, List{Int32})
+
+Adds a blank page before each page in the given range.
+
+Cpdf.padAfter(Cpdf.Pdf, List{Int32})
+
+Adds a blank page after each page in the given range.
+
+Cpdf.padEvery(Cpdf.Pdf, Int32)
+
+Adds a blank page after every n pages.
+
+Cpdf.padMultiple(Cpdf.Pdf, Int32)
+
+Adds pages at the end to pad the file to a multiple of n pages in length.
+
+Cpdf.padMultipleBefore(Cpdf.Pdf, Int32)
+
+Adds pages at the beginning to pad the file to a multiple of n pages in length.
diff --git a/html_manual/dotnetsplits/c11.tex b/html_manual/dotnetsplits/c11.tex
new file mode 100644
index 0000000..bf10106
--- /dev/null
+++ b/html_manual/dotnetsplits/c11.tex
@@ -0,0 +1,5 @@
+CHAPTER 10. Annotations
+
+Cpdf.annotationsJSON(Cpdf.Pdf)
+
+Returns the annotations from a PDF in JSON format
diff --git a/html_manual/dotnetsplits/c12.tex b/html_manual/dotnetsplits/c12.tex
new file mode 100644
index 0000000..be343b1
--- /dev/null
+++ b/html_manual/dotnetsplits/c12.tex
@@ -0,0 +1,368 @@
+CHAPTER 11. Document Information and Metadata
+
+Cpdf.isLinearized(String)
+
+Finds out if a document is linearized as quickly as possible without loading
+it.
+
+Cpdf.getVersion(Cpdf.Pdf)
+
+Returns the minor version number of a document.
+
+Cpdf.getMajorVersion(Cpdf.Pdf)
+
+Returns the minor version number of a document.
+
+Cpdf.getTitle(Cpdf.Pdf)
+
+Returns the title of a document.
+
+Cpdf.getAuthor(Cpdf.Pdf)
+
+Returns the author of a document.
+
+Cpdf.getSubject(Cpdf.Pdf)
+
+Returns the subject of a document.
+
+Cpdf.getKeywords(Cpdf.Pdf)
+
+Returns the keywords of a document.
+
+Cpdf.getCreator(Cpdf.Pdf)
+
+Returns the creator of a document.
+
+Cpdf.getProducer(Cpdf.Pdf)
+
+Returns the producer of a document.
+
+Cpdf.getCreationDate(Cpdf.Pdf)
+
+Returns the creation date of a document.
+
+Cpdf.getModificationDate(Cpdf.Pdf)
+
+Returns the modification date of a document.
+
+Cpdf.getTitleXMP(Cpdf.Pdf)
+
+Returns the XMP title of a document.
+
+Cpdf.getAuthorXMP(Cpdf.Pdf)
+
+Returns the XMP author of a document.
+
+Cpdf.getSubjectXMP(Cpdf.Pdf)
+
+Returns the XMP subject of a document.
+
+Cpdf.getKeywordsXMP(Cpdf.Pdf)
+
+Returns the XMP keywords of a document.
+
+Cpdf.getCreatorXMP(Cpdf.Pdf)
+
+Returns the XMP creator of a document.
+
+Cpdf.getProducerXMP(Cpdf.Pdf)
+
+Returns the XMP producer of a document.
+
+Cpdf.getCreationDateXMP(Cpdf.Pdf)
+
+Returns the XMP creation date of a document.
+
+Cpdf.getModificationDateXMP(Cpdf.Pdf)
+
+Returns the XMP modification date of a document.
+
+Cpdf.setTitle(Cpdf.Pdf, String)
+
+Sets the title of a document.
+
+Cpdf.setAuthor(Cpdf.Pdf, String)
+
+Sets the author of a document.
+
+Cpdf.setSubject(Cpdf.Pdf, String)
+
+Sets the subject of a document.
+
+Cpdf.setKeywords(Cpdf.Pdf, String)
+
+Sets the keywords of a document.
+
+Cpdf.setCreator(Cpdf.Pdf, String)
+
+Sets the creator of a document.
+
+Cpdf.setProducer(Cpdf.Pdf, String)
+
+Sets the producer of a document.
+
+Cpdf.setCreationDate(Cpdf.Pdf, String)
+
+Sets the creation date of a document.
+
+Cpdf.setModificationDate(Cpdf.Pdf, String)
+
+Sets the modification date of a document.
+
+Cpdf.setTitleXMP(Cpdf.Pdf, String)
+
+Sets the XMP title of a document.
+
+Cpdf.setAuthorXMP(Cpdf.Pdf, String)
+
+Sets the XMP author of a document.
+
+Cpdf.setSubjectXMP(Cpdf.Pdf, String)
+
+Sets the XMP subject of a document.
+
+Cpdf.setKeywordsXMP(Cpdf.Pdf, String)
+
+Sets the XMP keywords of a document.
+
+Cpdf.setCreatorXMP(Cpdf.Pdf, String)
+
+Sets the XMP creator of a document.
+
+Cpdf.setProducerXMP(Cpdf.Pdf, String)
+
+Sets the XMP producer of a document.
+
+Cpdf.setCreationDateXMP(Cpdf.Pdf, String)
+
+Sets the XMP creation date of a document.
+
+Cpdf.setModificationDateXMP(Cpdf.Pdf, String)
+
+Sets the XMP modification date of a document.
+
+Cpdf.getDateComponents(String, Int32@, Int32@, Int32@, Int32@, Int32@, Int32@,
+Int32@, Int32@)
+
+Returns the components from a PDF date string.
+
+Cpdf.dateStringOfComponents(Int32, Int32, Int32, Int32, Int32, Int32, Int32,
+Int32)
+
+Builds a PDF date string from individual components.
+
+Cpdf.getPageRotation(Cpdf.Pdf, Int32)
+
+Gets the viewing rotation for a given page.
+
+Cpdf.hasBox(Cpdf.Pdf, Int32, String)
+
+Returns true, if that page has the given box. E.g "/CropBox".
+
+Cpdf.getMediaBox(Cpdf.Pdf, Int32, Double@, Double@, Double@, Double@)
+
+Cpdf.getCropBox(Cpdf.Pdf, Int32, Double@, Double@, Double@, Double@)
+
+Cpdf.getTrimBox(Cpdf.Pdf, Int32, Double@, Double@, Double@, Double@)
+
+Cpdf.getArtBox(Cpdf.Pdf, Int32, Double@, Double@, Double@, Double@)
+
+Cpdf.getBleedBox(Cpdf.Pdf, Int32, Double@, Double@, Double@, Double@)
+
+These functions get a box given the document, page number, min x, max x,
+min y, max y in points. Only succeeds if such a box exists, as checked by
+hasBox.
+
+Cpdf.setMediabox(Cpdf.Pdf, List{Int32}, Double, Double, Double, Double)
+
+Cpdf.setCropBox(Cpdf.Pdf, List{Int32}, Double, Double, Double, Double)
+
+Cpdf.setTrimBox(Cpdf.Pdf, List{Int32}, Double, Double, Double, Double)
+
+Cpdf.setArtBox(Cpdf.Pdf, List{Int32}, Double, Double, Double, Double)
+
+Cpdf.setBleedBox(Cpdf.Pdf, List{Int32}, Double, Double, Double, Double)
+
+These functions set a box given the document, page range, min x, max x,
+min y, max y in points.
+
+Cpdf.markTrapped(Cpdf.Pdf)
+
+Marks a document as trapped.
+
+Cpdf.markUntrapped(Cpdf.Pdf)
+
+Marks a document as untrapped.
+
+Cpdf.markTrappedXMP(Cpdf.Pdf)
+
+Marks a document as trapped in XMP metadata.
+
+Cpdf.markUntrappedXMP(Cpdf.Pdf)
+
+Marks a document as untrapped in XMP metadata.
+
+Cpdf.Layout
+
+Layouts
+
+Cpdf.Layout.SinglePage
+
+Single page
+
+Cpdf.Layout.OneColumn
+
+One column
+
+Cpdf.Layout.TwoColumnLeft
+
+Two column left
+
+Cpdf.Layout.TwoColumnRight
+
+Two column right
+
+Cpdf.Layout.TwoPageLeft
+
+Two page left
+
+Cpdf.Layout.TwoPageRight
+
+Two page right
+
+Cpdf.setPageLayout(Cpdf.Pdf, Cpdf.Layout)
+
+Sets the page layout for a document.
+
+Cpdf.PageMode
+
+Page modes
+
+Cpdf.PageMode.UseNone
+
+Use none
+
+Cpdf.PageMode.UseOutlines
+
+Use outlines
+
+Cpdf.PageMode.UseThumbs
+
+Use thumbs
+
+Cpdf.PageMode.UseOC
+
+Use OC
+
+Cpdf.PageMode.UseAttachments
+
+Use attachments
+
+Cpdf.setPageMode(Cpdf.Pdf, Cpdf.PageMode)
+
+Sets the page mode for a document.
+
+Cpdf.hideToolbar(Cpdf.Pdf, Boolean)
+
+Sets the hide toolbar flag.
+
+Cpdf.hideMenubar(Cpdf.Pdf, Boolean)
+
+Sets the hide menubar flag.
+
+Cpdf.hideWindowUi(Cpdf.Pdf, Boolean)
+
+Sets the hide window UI flag.
+
+Cpdf.fitWindow(Cpdf.Pdf, Boolean)
+
+Sets the fit window flag.
+
+Cpdf.centerWindow(Cpdf.Pdf, Boolean)
+
+Sets the center window flag.
+
+Cpdf.displayDocTitle(Cpdf.Pdf, Boolean)
+
+Sets the display doc title flag.
+
+Cpdf.openAtPage(Cpdf.Pdf, Boolean, Int32)
+
+Sets the PDF to open, possibly with zoom-to-fit, at the given page number.
+
+Cpdf.setMetadataFromFile(Cpdf.Pdf, String)
+
+Sets the XMP metadata of a document, given a file name.
+
+Cpdf.setMetadataFromByteArray(Cpdf.Pdf, Byte[])
+
+Sets the XMP metadata from an array of bytes.
+
+Cpdf.removeMetadata(Cpdf.Pdf)
+
+Removes the XMP metadata from a document.
+
+Cpdf.getMetadata(Cpdf.Pdf)
+
+Returns the XMP metadata from a document.
+
+Cpdf.createMetadata(Cpdf.Pdf)
+
+Builds fresh metadata as best it can from
+existing metadata in the document.
+
+Cpdf.setMetadataDate(Cpdf.Pdf, String)
+
+Sets the metadata date for a PDF. The date is given in PDF date format -- cpdf
+will convert it to XMP format. The date 'now' means now.
+
+Cpdf.PageLabelStyle
+
+Page label styles
+
+Cpdf.PageLabelStyle.DecimalArabic
+
+1, 2, 3...
+
+Cpdf.PageLabelStyle.UppercaseRoman
+
+I, II, III...
+
+Cpdf.PageLabelStyle.LowercaseRoman
+
+i, ii, iii...
+
+Cpdf.PageLabelStyle.UppercaseLetters
+
+A, B, C...
+
+Cpdf.PageLabelStyle.LowercaseLetters
+
+a, b, c...
+
+Cpdf.addPageLabels(Cpdf.Pdf, Cpdf.PageLabelStyle, String, Int32, List{Int32},
+Boolean)
+
+Adds page labels. The prefix is prefix text for each label. The range is the
+page range the labels apply to. Offset can be used to shift the numbering up or
+down.
+
+Cpdf.removePageLabels(Cpdf.Pdf)
+
+Removes the page labels from the document.
+
+Cpdf.getPageLabelStringForPage(Cpdf.Pdf, Int32)
+
+Calculates the full label string for a given page, and returns it.
+
+Cpdf.startGetPageLabels(Cpdf.Pdf)
+
+Cpdf.getPageLabelStyle(Int32)
+
+Cpdf.getPageLabelPrefix(Int32)
+
+Cpdf.getPageLabelOffset(Int32)
+
+Cpdf.getPageLabelRange(Int32)
+
+Cpdf.endGetPageLabels
diff --git a/html_manual/dotnetsplits/c13.tex b/html_manual/dotnetsplits/c13.tex
new file mode 100644
index 0000000..487cd7a
--- /dev/null
+++ b/html_manual/dotnetsplits/c13.tex
@@ -0,0 +1,47 @@
+CHAPTER 12. File Attachments
+
+Cpdf.attachFile(String, Cpdf.Pdf)
+
+Attaches a file to the pdf. It is attached at document level.
+
+Cpdf.attachFileToPage(String, Cpdf.Pdf, Int32)
+
+Attaches a file, given its file name, pdf, and the page number to which it
+should be attached.
+
+Cpdf.attachFileFromMemory(Byte[], String, Cpdf.Pdf)
+
+Attaches data from memory, just like attachFile.
+
+Cpdf.attachFileToPageFromMemory(Byte[], String, Cpdf.Pdf, Int32)
+
+Attaches to a page from memory, just like attachFileToPage.
+
+Cpdf.removeAttachedFiles(Cpdf.Pdf)
+
+Removes all page- and document-level attachments from a document.
+
+Cpdf.startGetAttachments(Cpdf.Pdf)
+
+Cpdf.numberGetAttachments
+
+Lists information about attachments. Call startGetAttachments(pdf) first, then
+numberGetAttachments to find out how many there are. Then getAttachmentName
+etc. to return each one 0...(n - 1). Finally, call endGetAttachments to clean
+up.
+
+Cpdf.getAttachmentName(Int32)
+
+Gets the name of an attachment.
+
+Cpdf.getAttachmentPage(Int32)
+
+Gets the page number. 0 = document level.
+
+Cpdf.getAttachmentData(Int32)
+
+Gets the attachment data itself.
+
+Cpdf.endGetAttachments
+
+Cleans up after getting attachments.
diff --git a/html_manual/dotnetsplits/c14.tex b/html_manual/dotnetsplits/c14.tex
new file mode 100644
index 0000000..f81eb99
--- /dev/null
+++ b/html_manual/dotnetsplits/c14.tex
@@ -0,0 +1,25 @@
+CHAPTER 13. Images.
+
+Cpdf.startGetImageResolution(Cpdf.Pdf, Double)
+
+Cpdf.getImageResolutionPageNumber(Int32)
+
+Cpdf.getImageResolutionImageName(Int32)
+
+Cpdf.getImageResolutionXPixels(Int32)
+
+Cpdf.getImageResolutionYPixels(Int32)
+
+Cpdf.getImageResolutionXRes(Int32)
+
+Cpdf.getImageResolutionYRes(Int32)
+
+Cpdf.endGetImageResolution
+
+Gets image data, including resolution at all points of use. Call
+startGetImageResolution(pdf, min_required_resolution) will begin the
+process of obtaining data on all image uses below min_required_resolution,
+returning the total number. So, to return all image uses, specify a very
+high min_required_resolution. Then, call the other functions giving a
+serial number 0..n - 1, to retrieve the data. Finally, call
+endGetImageResolution to clean up.
diff --git a/html_manual/dotnetsplits/c15.tex b/html_manual/dotnetsplits/c15.tex
new file mode 100644
index 0000000..66073b8
--- /dev/null
+++ b/html_manual/dotnetsplits/c15.tex
@@ -0,0 +1,30 @@
+CHAPTER 14. Fonts.
+
+Cpdf.startGetFontInfo(Cpdf.Pdf)
+
+Cpdf.numberFonts
+
+Cpdf.getFontPage(Int32)
+
+Cpdf.getFontName(Int32)
+
+Cpdf.getFontType(Int32)
+
+Cpdf.getFontEncoding(Int32)
+
+Cpdf.endGetFontInfo
+
+Retrieves font information. First, call startGetFontInfo(pdf). Now call
+numberFonts to return the number of fonts. For each font, call one or more of
+getFontPage, getFontName, getFontType, and getFontEncoding giving a serial
+number 0..n - 1 to return information. Finally, call endGetFontInfo to clean
+up.
+
+Cpdf.removeFonts(Cpdf.Pdf)
+
+Removes all font data from a file.
+
+Cpdf.copyFont(Cpdf.Pdf, Cpdf.Pdf, List{Int32}, Int32, String)
+
+Copies the given font from the given page in the 'from' PDF to every page in
+the 'to' PDF. The new font is stored under its font name.
diff --git a/html_manual/dotnetsplits/c16.tex b/html_manual/dotnetsplits/c16.tex
new file mode 100644
index 0000000..7129ff2
--- /dev/null
+++ b/html_manual/dotnetsplits/c16.tex
@@ -0,0 +1,19 @@
+CHAPTER 15. PDF and JSON
+
+Cpdf.outputJSON(String, Boolean, Boolean, Boolean, Cpdf.Pdf)
+
+Outputs a PDF in JSON format to the given filename. If parse_content is true,
+page content is parsed. If no_stream_data is true, all stream data is
+suppressed entirely.
+
+Cpdf.outputJSONMemory(Cpdf.Pdf, Boolean, Boolean, Boolean)
+
+Like outputJSON, but it writes to a byte array in memory.
+
+Cpdf.fromJSON(String)
+
+Loads a PDF from a JSON file given its filename.
+
+Cpdf.fromJSONMemory(Byte[])
+
+Loads a PDF from a JSON file in memory
diff --git a/html_manual/dotnetsplits/c17.tex b/html_manual/dotnetsplits/c17.tex
new file mode 100644
index 0000000..9e5be3c
--- /dev/null
+++ b/html_manual/dotnetsplits/c17.tex
@@ -0,0 +1,28 @@
+CHAPTER 16. Optional Content Groups
+
+Cpdf.startGetOCGList(Cpdf.Pdf)
+
+Begins retrieving optional content group names. The serial number 0..n - 1 is
+returned.
+
+Cpdf.OCGListEntry(Int32)
+
+Retrieves an OCG name, given its serial number 0..n - 1.
+
+Cpdf.endGetOCGList
+
+Ends retrieval of optional content group names.
+
+Cpdf.OCGRename(Cpdf.Pdf, String, String)
+
+Renames an optional content group.
+
+Cpdf.OCGOrderAll(Cpdf.Pdf)
+
+Ensures that every optional content group appears in the OCG order list.
+
+Cpdf.OCGCoalesce(Cpdf.Pdf)
+
+Coalesces optional content groups. For example, if we merge or stamp two files
+both with an OCG called "Layer 1", we will have two different optional content
+groups. This function will merge the two into a single optional content group.
diff --git a/html_manual/dotnetsplits/c18.tex b/html_manual/dotnetsplits/c18.tex
new file mode 100644
index 0000000..043b0ec
--- /dev/null
+++ b/html_manual/dotnetsplits/c18.tex
@@ -0,0 +1,20 @@
+CHAPTER 17. Creating New PDFs
+
+Cpdf.blankDocument(Double, Double, Int32)
+
+Creates a blank document with pages of the given width (in points), height (in
+points), and number of pages.
+
+Cpdf.blankDocumentPaper(Cpdf.Papersize, Int32)
+
+Makes a blank document given a page size and number of pages.
+
+Cpdf.textToPDF(Double, Double, Cpdf.Font, Double, String)
+
+Typesets a UTF8 text file ragged right on a page of size w * h in points in the
+given font and font size.
+
+Cpdf.textToPDFPaper(Cpdf.Papersize, Cpdf.Font, Double, String)
+
+Typesets a UTF8 text file ragged right on a page of the given size in the given
+font and font size.
diff --git a/html_manual/dotnetsplits/c19.tex b/html_manual/dotnetsplits/c19.tex
new file mode 100644
index 0000000..a7d58f9
--- /dev/null
+++ b/html_manual/dotnetsplits/c19.tex
@@ -0,0 +1,70 @@
+CHAPTER 18. Miscellaneous
+
+Cpdf.draft(Cpdf.Pdf, List{Int32}, Boolean)
+
+Removes images on the given pages, replacing them with crossed boxes if 'boxes'
+is true.
+
+Cpdf.removeAllText(Cpdf.Pdf, List{Int32})
+
+Removes all text from the given pages in a given document.
+
+Cpdf.blackText(Cpdf.Pdf, List{Int32})
+
+Blackens all text on the given pages.
+
+Cpdf.blackLines(Cpdf.Pdf, List{Int32})
+
+Blackens all lines on the given pages.
+
+Cpdf.blackFills(Cpdf.Pdf, List{Int32})
+
+Blackens all fills on the given pages.
+
+Cpdf.thinLines(Cpdf.Pdf, List{Int32}, Double)
+
+Thickens every line less than min_thickness to min_thickness. Thickness given
+in points.
+
+Cpdf.copyId(Cpdf.Pdf, Cpdf.Pdf)
+
+Copies the /ID from one document to another.
+
+Cpdf.removeId(Cpdf.Pdf)
+
+Removes a document's /ID.
+
+Cpdf.setVersion(Cpdf.Pdf, Int32)
+
+Sets the minor version number of a document.
+
+Cpdf.setFullVersion(Cpdf.Pdf, Int32, Int32)
+
+Sets the full version number of a document.
+
+Cpdf.removeDictEntry(Cpdf.Pdf, String)
+
+Removes any dictionary entry with the given key anywhere in the document.
+
+Cpdf.removeDictEntrySearch(Cpdf.Pdf, String, String)
+
+Removes any dictionary entry with the given key whose value matches the given
+search term.
+
+Cpdf.replaceDictEntry(Cpdf.Pdf, String, String)
+
+Replaces the value associated with the given key.
+
+Cpdf.replaceDictEntrySearch(Cpdf.Pdf, String, String, String)
+
+Replaces the value associated with the given key if the existing value matches
+the search term.
+
+Cpdf.removeClipping(Cpdf.Pdf, List{Int32})
+
+Removes all clipping from pages in the given range.
+
+Cpdf.getDictEntries(Cpdf.Pdf, String)
+
+Returns a JSON array containing any and all values associated with the given
+key, and fills in its length.
diff --git a/html_manual/dotnetsplits/cm1.tex b/html_manual/dotnetsplits/cm1.tex
new file mode 100644
index 0000000..805adc2
--- /dev/null
+++ b/html_manual/dotnetsplits/cm1.tex
@@ -0,0 +1,28 @@
+CPDF .NET Library
+=================
+
+Before using the library, you must make sure your project or build environment
+has access to the cpdf DLL, which is not part of the .NET assembly. You can add
+it to a Visual Studio project as a file, set to copy-to-output-folder. Or, you
+can install it in a standard location. The DLL must be named as follows, for
+.NET to be able to find it:
+
+Windows: cpdf.dll
+MacOS: libcpdf.dylib
+Linux: libcpdf.so
+
+The following documentation is automatically extracted from the XML comments
+present in the assembly. You can use Intellisense to view them within Visual
+Studio - the documentation here is for completeness.
+
+A 'range' is a list of integers specifying page numbers.
+
+Text arguments and results are in UTF8. Data is of type bytes[].
+
+Any function may raise the exception CPDFError, carrying a string describing
+the error.
+
+There is no automatic garbage collection of PDFs. Use the Using keyword and/or
+the Dispose method on objects of type Cpdf.Pdf to explicitly deallocate PDFs.
+
+