Some test text!

< iOS samples

UnicodeWriteTest - Swift

An example illustrating how to create Unicode text and how to embed composite fonts.

//---------------------------------------------------------------------------------------
// Copyright (c) 2001-2017 by PDFTron Systems Inc. All Rights Reserved.
// Consult legal.txt regarding legal and license information.
//---------------------------------------------------------------------------------------

import PDFNet
import Foundation

/**
 * This example illustrates how to create Unicode text and how to embed composite fonts.
 *
 * Note: This demo assumes that 'arialuni.ttf' is present in '/Samples/TestFiles'
 * directory. Arial Unicode MS is about 24MB in size and it comes together with Windows and
 * MS Office.
 *
 * For more information about Arial Unicode MS, please consult the following Microsoft Knowledge
 * Base Article: WD2002: General Information About the Arial Unicode MS Font
 *    http://support.microsoft.com/support/kb/articles/q287/2/47.asp
 *    (https://web.archive.org/web/20060504053941/http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q287/2/47.aspp&NoWebContent=1)
 *
 * For more information consult:
 *    http://office.microsoft.com/search/results.aspx?Scope=DCC&Query=fontt&CTT=66&Origin=EC010331121033
 *    http://www.microsoft.com/downloads/details.aspx?FamilyID=1F0303AE-F055-41DA-A086-A65F22CB5593
 *
 * In case you don't have access to Arial Unicode MS you can use cyberbit.ttf
 * (http://ftp.netscape.com/pub/communicator/extras/fonts/windows/) instead.
 */

func runUnicodeWriteTest() -> Int {
    return autoreleasepool {
        var ret = 0
        
        
        do {
            try PTPDFNet.catchException {
        
                // Relative path to the folder containing test files.
                let input_path: String = Bundle.main.resourcePath ?? "" + ("/")
                
                let doc: PTPDFDoc = PTPDFDoc()
                
                let eb: PTElementBuilder = PTElementBuilder()
                let writer: PTElementWriter = PTElementWriter()
                
                // Start a new page ------------------------------------
                let rect = PTPDFRect(x1: 0, y1: 0, x2: 612, y2: 794)
                let page: PTPage = doc.pageCreate(rect)
                
                writer.writerBegin(with: page, placement: e_ptoverlay, page_coord_sys: true, compress: true)    // begin writing to this page
                var fnt = PTFont()
                do {
                    try PTPDFNet.catchException {
                        // Embed and subset the font
                        fnt = PTFont.createCIDTrueTypeFont(doc.getSDFDoc(), font_path: Bundle.main.path(forResource: "ARIALUNI", ofType: "ttf"), embed: true, subset: true, encoding: e_ptIdentityH, ttc_font_index: 0)
                    }
                } catch {
                    print("Note: 'arialuni.ttf' font file was not found in \(input_path) directory.")
                    ret = 1
                }
                
                let element: PTElement = eb.createTextBegin(with: fnt, font_sz: 1)
                let m = PTMatrix2D(a: 10, b: 0, c: 0, d: 10, h: 50, v: 600)
                element.setTextMatrix(with: m)
                element.getGState().setLeading(2)   // Set the spacing between lines
                writer.write(element)
                
                // Hello World!
                let helloRaw: [Character] = [
                    "H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d", "!"
                ]
                var hello: [UInt16] = String(helloRaw).utf16.map{ UInt16($0) }
                writer.write(eb.createUnicodeTextRun((&hello, text_data_sz: UInt32(hello.count)))
                writer.write(eb.createTextNewLine())
                
                // Latin
                let latinRaw: [Character] = [
                    "a", "A", "b", "B", "c", "C", "d", "D", "\u{45}", "\u{0046}", "\u{00c0}", "\u{00c1}", "\u{00c2}", "\u{0143}", "\u{0144}", "\u{0145}", "\u{0152}", "1", "2" // etc.
                ]
                var latin: [UInt16] = String(latinRaw).utf16.map{ UInt16($0) }
                writer.write(eb.createUnicodeTextRun((&latin, text_data_sz: UInt32(latin.count)))
                writer.write(eb.createTextNewLine())
                
                // Greek
                var greek: [UInt16] = [
                    0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A6, 0x03A8, 0x03A9 // etc.
                ]
                writer.write(eb.createUnicodeTextRun((&greek, text_data_sz: UInt32(greek.count)))
                writer.write(eb.createTextNewLine())
                
                // Cyrillic
                var cyrillic: [UInt16] = [
                    0x0409, 0x040A, 0x040B, 0x040C, 0x040E, 0x040F, 0x0410, 0x0411,
                    0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419 // etc.
                ]
                writer.write(eb.createUnicodeTextRun((&cyrillic, text_data_sz: UInt32(cyrillic.count)))
                writer.write(eb.createTextNewLine())
                
                // Hebrew
                var hebrew: [UInt16] = [
                    0x05D0, 0x05D1, 0x05D3, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8,
                    0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1 // etc.
                ]
                writer.write(eb.createUnicodeTextRun((&hebrew, text_data_sz: UInt32(hebrew.count)))
                writer.write(eb.createTextNewLine())
                
                // Arabic
                var arabic: [UInt16] = [
                    0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C,
                    0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635 // etc.
                ]
                writer.write(eb.createUnicodeTextRun((&arabic, text_data_sz: UInt32(arabic.count)))
                writer.write(eb.createTextNewLine())
                
                // Thai
                var thai: [UInt16] = [
                    0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09,
                    0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 0x0E10, 0x0E11, 0x0E12 // etc.
                ]
                writer.write(eb.createUnicodeTextRun((&thai, text_data_sz: UInt32(thai.count)))
                writer.write(eb.createTextNewLine())
                
                // Hiragana - Japanese
                var hiragana: [UInt16] = [
                    0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049,
                    0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3051, 0x3051, 0x3052 // etc.
                ]
                writer.write(eb.createUnicodeTextRun((&hiragana, text_data_sz: UInt32(hiragana.count)))
                writer.write(eb.createTextNewLine())
                
                // CJK Unified Ideographs
                var cjk_uni: [UInt16] = [
                    0x5841, 0x5842, 0x5843, 0x5844, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849,
                    0x584A, 0x584B, 0x584C, 0x584D, 0x584E, 0x584F, 0x5850, 0x5851, 0x5852 // etc.
                ]
                writer.write(eb.createUnicodeTextRun((&cjk_uni, text_data_sz: UInt32(cjk_uni.count)))
                writer.write(eb.createTextNewLine())
                
                // Simplified Chinese
                var chinese_simplified: [UInt16] = [
                    0x4e16, 0x754c, 0x60a8, 0x597d
                ]
                writer.write(eb.createUnicodeTextRun((&chinese_simplified, text_data_sz: UInt32(chinese_simplified.count)))
                writer.write(eb.createTextNewLine())
                
                // Finish the block of text
                writer.write(eb.createTextEnd())
                
                writer.end()    // save changes to the current page
                doc.pagePushBack(page)
                
                doc.save(toFile: URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent("unicodewrite.pdf").path, flags: e_ptremove_unused.rawValue | e_pthex_strings.rawValue)
                print("Done. Result saved in unicodewrite.pdf...")
            }
        } catch let e as NSError {
            print("\(e)")
            ret = 1
        }
        
        return ret
    }
}