Some test text!


Create Unicode text or embed composite fonts in PDF files using Swift

More languages

More languages
Java (Android)
C# (.NET Core)
JS (Node.js)
C# (UWP)
C# (Xamarin)

Sample Swift code for using PDFTron SDK to create Unicode text and embed composite fonts in PDF files. Learn more about our Swift PDF Library .

Get Started Samples Download

To run this sample, get started with a free trial of PDFTron SDK.

// Copyright (c) 2001-2019 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
 *    (
 * For more information consult:
 * In case you don't have access to Arial Unicode MS you can use cyberbit.ttf
 * ( 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, resources: nil)    // 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
                // Hello World!
                let helloRaw: [Character] = [
                    "H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d", "!"
                var hello: [UInt16] = String(helloRaw){ UInt16($0) }
                writer.write(eb.createUnicodeTextRun(&hello, text_data_sz: UInt32(hello.count)))
                // 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){ UInt16($0) }
                writer.write(eb.createUnicodeTextRun(&latin, text_data_sz: UInt32(latin.count)))
                // Greek
                var greek: [UInt16] = [
                    0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A6, 0x03A8, 0x03A9 // etc.
                writer.write(eb.createUnicodeTextRun(&greek, text_data_sz: UInt32(greek.count)))
                // 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)))
                // 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)))
                // 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)))
                // 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)))
                // 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)))
                // 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)))
                // Simplified Chinese
                var chinese_simplified: [UInt16] = [
                    0x4e16, 0x754c, 0x60a8, 0x597d
                writer.write(eb.createUnicodeTextRun(&chinese_simplified, text_data_sz: UInt32(chinese_simplified.count)))
                // Finish the block of text
                writer.end()    // save changes to the current page
                print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
       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 {
            ret = 1
        return ret

Free Trial

Get unlimited trial usage of PDFTron SDK to bring accurate, reliable, and fast document processing capabilities to any application or workflow.

Select a platform to get started with your free trial.

Unlimited usage. No email address required.