TPPDF is a simple-to-use PDF builder for iOS

Last update: Jun 10, 2022

TPPDF

TPPDF is a fast PDF builder for iOS & macOS using simple commands to create advanced documents!

Swift iOS|macOS License
Swift Package Manager Cocoapods Carthage

Created and maintained by Philip Niedertscheider and all the amazing contributors.

FeaturesGetting StartedCommunicationUsageInstallationCreditsLicense

Features

  • Page header and footer
  • Dynamic content layout with page alignment
  • Support for tables and cell alignment
  • Attributed strings
  • Custom spacing
  • Image support
  • Horizontal line separators
  • Custom indentation
  • Custom top offset (good for layered rendering)
  • Pagination
  • Image caption
  • Compress images
  • Custom image size fit
  • Images in the header and footer
  • Horizontal line separators in the header and footer
  • Generate PDF files directly to handle large PDF files (Details)
  • PDF metadata
  • Custom table styling
  • Multi-column sections
  • Swift Package Manager Support
  • Tables with cell merging & automatic page breaking
  • Hyperlinks in text
  • Native progress tracking using Foundation.Progress
  • Documentation

Getting Started

Building a PDF document is very easy:

First, you create a document with a paperformat...

let document = PDFDocument(format: .a4)

...then you add your information to a container...

document.add(.contentCenter, text: "Create PDF documents easily.")

...then you render the document...

let generator = PDFGenerator(document: document)
let url  = try generator.generateURL(filename: "Example.pdf")

...done!

If you need more details, checkout Usage.

Communication

Attention:

TPPDF is an Open Source side-project of techprimate. As we are currently working on multiple other projects, we only have limited time for fixing bugs and enhancing TPPDF.

That's why any issue reporting and especially Pull Requests are very welcome!

If you need professional support for your company, you can reach out to @philprimes on Twitter or on our website techprimate.com! This is mainly for custom or high-priority requests, therefore we won't publish a consulting pricing for now.

For everything else, please see Communication and this message. Thank you!

  • If you need help, use Stack Overflow. (Tag 'TPPDF') Just open up another issue, it might lead to better documentation.
  • If you found a bug, open an issue.
  • If you have a feature request, open an issue.
  • If you want to contribute, submit a pull request.

Example

Take a look at the Getting Started Guide or checkout the Examples (using of one of the following):

  • Clone the repository and look at the Example folders
  • Run pod try TPPDF

Apps using TPPDF

If you are using TPPDF in your app and want to be listed here, simply create a pull request or let us know on Twitter or via GitHub. We are always curious to see, who is using our project :)

Burnout Coach - by Stéphane Mégy

Burnout Coach

ChatHistory - by techprimate

ChatHistory

Hikingbook - by Zheng-Xiang Ke

Hikingbook

Bug Journal - by David Johnson

Bug Journal

Energy Tracker - by Stefan Nebel

Energy Tracker

Credits

TPPDF is created and maintained by Philip Niedertscheider, founder of techprimate.

techprimate.com twitter facebook facebook

Contributors

Please consider backing this project by using the following GitHub Sponsor button.

We want to thank all contributors for their effort!

License

TPPDF is available under the MIT license. See the LICENSE file for more info.

GitHub

https://github.com/Techprimate/TPPDF
Comments
  • 1. PDFSection overlap

    I'm trying with the example target provided with this project

    minimum code to reproduce the problem

    let document = PDFDocument(format: .a4)
    let section = PDFSection(columnWidths: [0.3, 0.7])
            section.columns[0].addText(.left, text: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem")
            section.columns[1].addText(.left, text: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.")
            
    document.addSection(section)
            
    document.addSection(section)
    

    simulator screen shot - ipad air 2 - 2018-05-30 at 16 57 18 simulator screen shot - ipad air 2 - 2018-05-30 at 16 57 27

    Help would be appreciated

    Reviewed by omiz at 2018-05-30 14:59
  • 2. problem with showHeadersOnEveryPage

    Hi , i am using TPPDF 2.2.0 and integrating in a personal iOS app i am writing . a great library , thank you but i am trying to understand showHeadersOnEveryPage when showHeadersOnEveryPage is true, the header row overwrites the top row on the next page and ends up hiding it. i don't see any properties to add space after the header row. being new, i might have overlooked something

    here are two screenshots.. without a header and with. the 20:12 entry is overwritten by the header row without header with header

    thank you Sami

    Reviewed by Sgkhour at 2020-07-18 19:32
  • 3. Column Wrap

    Is it possible to have content wrap to the next column instead of the next page? Or to get the height of each added object (text, table, etc) so I can manually wrap object to the next column in a section?

    Reviewed by donnnyrewq at 2019-02-03 10:58
  • 4. Getting UIGraphicsGetCurrentContext() nil

    I am getting UIGraphicsGetCurrentContext() nil when the app is run in device, it works fine in simulator.

    Here's the method where UIGraphicsGetCurrentContext() is nil:

        override func draw(generator: PDFGenerator, container: PDFContainer) throws {
            if attributedString == nil {
                throw PDFError.textObjectNotCalculated
            }
    
            // Get current graphics context
            let currentContext = UIGraphicsGetCurrentContext()!
    
            // Create a core text frame setter
            let framesetter = CTFramesetterCreateWithAttributedString(attributedString)
    
            // Save context pre manipulation
            currentContext.saveGState()
    
            // Reset text matrix, so no text scaling is affected
            currentContext.textMatrix = CGAffineTransform.identity
    
            // Create the frame and a rectangular path of the text frame
            let frameRect = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
            let framePath = UIBezierPath(rect: frameRect).cgPath
    
            // Create core text frame for the given attributed string
            // The whole text should fit the frame, as calculations were already done
            let frameRef = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attributedString.length), framePath, nil)
    
            // Translate by 100% graphics height up and reverse scale, as core text does draw from bottom up and not from top down
            currentContext.translateBy(x: 0, y: UIGraphicsGetPDFContextBounds().height)
            currentContext.scaleBy(x: 1.0, y: -1.0)
    
            // Translate context to actual position of text
            currentContext.translateBy(x: frame.minX, y: UIGraphicsGetPDFContextBounds().height - frame.maxY)
    
            // Draw text into context
            CTFrameDraw(frameRef, currentContext)
    
            // Restore context to pre manipulation
            currentContext.restoreGState()
    
            // If debugging is enabled, draw a outline around the text
            if generator.debug {
                PDFGraphics.drawRect(rect: self.frame, outline: PDFLineStyle(type: .dashed, color: .red, width: 1.0), fill: .clear)
            }
        }
    

    Any help on this would be much appreciated. Thanks.

    Reviewed by zaeem-khatib at 2019-03-30 16:34
  • 5. Blank page at the end of each batched document (external document)

    I am currently using the 'develop' branch in order to test adding external PDFs. While the functionality is running great I keep running into an issue were a blank page is added in the end after importing an external document.

    Here is what I am using batchPagesv2.add(externalDocument: PDFExternalDocument(url: url, pages: pages[count]))

    Whats interesting is that if I duplicate the batch job multiple times, only one extra blank page is added on the end. If I do not use external documents there is no blank page added either. So I am a bit lost as to where this page is coming from.

    So either this can be flagged as a bug or a feature suggestion to maybe make a boolean to filter out blank pages upon generation.

    Reviewed by EliteTechnicalCare at 2019-12-30 09:46
  • 6. Dynamically Add A Page while creating a PDFDocument

    I am using this library to generate a PDF of content added by the user. I am using: let pdfDocument = PDFDocument(format: .a4) and then adding text, table as required.

    I wanted to know if there is a way to dynamically create a new page once content had reached the end of page one. Please advise.

    Reviewed by harishchopra86 at 2021-03-21 22:03
  • 7. Carthage Support is broken [1.5.3]

    At least on my end, Carthage can not build the framework for the latest release 1.5.3.

    The first error that came up was the missing shared scheme as described in #98. Unchecking and checking the box for the TPPDF scheme as described in this comment did fix the issue.

    However the framework still does not build due to a missing .plist file. Here's the error message when running carthage build --verbose --platform "iOS" --no-skip-current TPPDF:

    error: could not read data from '$(SRC_ROOT)/Carthage/Checkouts/TPPDF/Example/Pods/Target Support Files/TPPDF/TPPDF-Info.plist': The file “TPPDF-Info.plist” couldn’t be opened because there is no such file.
    

    And indeed there is no such file; The actual directory contents are:

    $ tree Target\ Support\ Files
                                                                                                                                                                                         
    Target\ Support\ Files
    ├── Nimble
    │   ├── Nimble-dummy.m
    │   ├── Nimble-prefix.pch
    │   ├── Nimble-umbrella.h
    │   ├── Nimble.modulemap
    │   └── Nimble.xcconfig
    ├── Pods-TPPDF_Example
    │   ├── Pods-TPPDF_Example-acknowledgements.markdown
    │   ├── Pods-TPPDF_Example-acknowledgements.plist
    │   ├── Pods-TPPDF_Example-dummy.m
    │   ├── Pods-TPPDF_Example-frameworks.sh
    │   ├── Pods-TPPDF_Example-umbrella.h
    │   ├── Pods-TPPDF_Example.debug.xcconfig
    │   ├── Pods-TPPDF_Example.modulemap
    │   └── Pods-TPPDF_Example.release.xcconfig
    ├── Pods-TPPDF_Tests
    │   ├── Pods-TPPDF_Tests-acknowledgements.markdown
    │   ├── Pods-TPPDF_Tests-acknowledgements.plist
    │   ├── Pods-TPPDF_Tests-dummy.m
    │   ├── Pods-TPPDF_Tests-frameworks.sh
    │   ├── Pods-TPPDF_Tests-umbrella.h
    │   ├── Pods-TPPDF_Tests.debug.xcconfig
    │   ├── Pods-TPPDF_Tests.modulemap
    │   └── Pods-TPPDF_Tests.release.xcconfig
    ├── Quick
    │   ├── Quick-dummy.m
    │   ├── Quick-prefix.pch
    │   ├── Quick-umbrella.h
    │   ├── Quick.modulemap
    │   └── Quick.xcconfig
    └── TPPDF
        ├── TPPDF-dummy.m
        ├── TPPDF-prefix.pch
        ├── TPPDF-umbrella.h
        ├── TPPDF.modulemap
        └── TPPDF.xcconfig
    

    Edit: 1.4.1 fails with the same error message (missing .plist file). But the shared TPPDF scheme is present after checkout.

    Reviewed by mbger at 2019-08-07 11:39
  • 8. no shared framework schemes

    Hi

    I'm new to this and i got an Error, which i think a had somewhen before. Could you please help me and fix this? ERROR: *** Skipped building TPPDF due to the error: Dependency "TPPDF" has no shared framework schemes for any of the platforms: iOS If you believe this to be an error, please file an issue with the maintainers at https://github.com/Techprimate/TPPDF/issues/new

    THANX A LOT!!!!! Reinhard

    Reviewed by reinhardjung at 2018-10-25 17:43
  • 9. Image as NSTextAttachment gets lost

    Hey. I try to have an image attached into the NSAttributedString but the image gets lost.

            let pdf = PDFGenerator(format: .a4)
            
            let typeDetails = NSMutableAttributedString()
            let attachment = NSTextAttachment()
            attachment.image = Img.checked
            attachment.bounds = CGRect(x: 0, y: 0, width: 10, height: 10)
            let attachmentStr = NSAttributedString(attachment: attachment)
            
            typeDetails.append( NSAttributedString(string: ">>>>>") )
            typeDetails.append(attachmentStr)
            typeDetails.append( NSAttributedString(string: "<<<<<") )
            pdf.addAttributedText(text: typeDetails)
    
    screen shot 2017-11-03 at 2 25 28 pm

    I have tried several approaches as well as several images.

    idea?

    Reviewed by davidseek at 2017-11-03 21:23
  • 10. PDFTable Image Quality

    Hello,

    Thank you for this wonderful library. This is so helpful.

    I just want to ask if would it be possible to control the image quality on the table? 'Cause right now it kinda blurry. I would like to remain the quality of the image as possible so it won't appear blurry. Thank you in advance for your help.

    Reviewed by yhelfronda at 2019-01-19 18:37
  • 11. Table cells cut off at end of page

    down vote favorite

    I posted this on stackoverflow, but I couldn't find a TPPDF tag to tag it with.

    I'm having a problem with a table cell being cut off at the bottom of the page when using the TPPDF cocoapod in a swift 4 app for i-pad. Only part of the cell shows with no text

    I'm creating a series of tables in my document. Because the column widths are variable I'm adding a new table for each row.

    Is there a way to either prevent this from happening or to determine when to add a page break? screen shot 2018-09-12 at 10 29 39 am

    Reviewed by ghost at 2018-09-12 15:55
  • 12. Customizing header/pagination for specific page

    Is it possible to set custom for a header or hide part of the header on the first page? Is it possible to hide pagination when I have one page in pdf and show when there is more than one page?

    Reviewed by oleksandrivantsov at 2022-06-22 09:00
  • 13. Bump nokogiri from 1.13.4 to 1.13.6

    Bumps nokogiri from 1.13.4 to 1.13.6.

    Release notes

    Sourced from nokogiri's releases.

    1.13.6 / 2022-05-08

    Security

    • [CRuby] Address CVE-2022-29181, improper handling of unexpected data types, related to untrusted inputs to the SAX parsers. See GHSA-xh29-r2w5-wx8m for more information.

    Improvements

    • {HTML4,XML}::SAX::{Parser,ParserContext} constructor methods now raise TypeError instead of segfaulting when an incorrect type is passed.

    sha256:

    58417c7c10f78cd1c0e1984f81538300d4ea98962cfd3f46f725efee48f9757a  nokogiri-1.13.6-aarch64-linux.gem
    a2b04ec3b1b73ecc6fac619b41e9fdc70808b7a653b96ec97d04b7a23f158dbc  nokogiri-1.13.6-arm64-darwin.gem
    4437f2d03bc7da8854f4aaae89e24a98cf5c8b0212ae2bc003af7e65c7ee8e27  nokogiri-1.13.6-java.gem
    99d3e212bbd5e80aa602a1f52d583e4f6e917ec594e6aa580f6aacc253eff984  nokogiri-1.13.6-x64-mingw-ucrt.gem
    a04f6154a75b6ed4fe2d0d0ff3ac02f094b54e150b50330448f834fa5726fbba  nokogiri-1.13.6-x64-mingw32.gem
    a13f30c2863ef9e5e11240dd6d69ef114229d471018b44f2ff60bab28327de4d  nokogiri-1.13.6-x86-linux.gem
    63a2ca2f7a4f6bd9126e1695037f66c8eb72ed1e1740ef162b4480c57cc17dc6  nokogiri-1.13.6-x86-mingw32.gem
    2b266e0eb18030763277b30dc3d64337f440191e2bd157027441ac56a59d9dfe  nokogiri-1.13.6-x86_64-darwin.gem
    3fa37b0c3b5744af45f9da3e4ae9cbd89480b35e12ae36b5e87a0452e0b38335  nokogiri-1.13.6-x86_64-linux.gem
    b1512fdc0aba446e1ee30de3e0671518eb363e75fab53486e99e8891d44b8587  nokogiri-1.13.6.gem
    

    1.13.5 / 2022-05-04

    Security

    Dependencies

    • [CRuby] Vendored libxml2 is updated from v2.9.13 to v2.9.14.

    Improvements

    • [CRuby] The libxml2 HTML4 parser no longer exhibits quadratic behavior when recovering some broken markup related to start-of-tag and bare < characters.

    Changed

    • [CRuby] The libxml2 HTML4 parser in v2.9.14 recovers from some broken markup differently. Notably, the XML CDATA escape sequence <![CDATA[ and incorrectly-opened comments will result in HTML text nodes starting with &lt;! instead of skipping the invalid tag. This behavior is a direct result of the quadratic-behavior fix noted above. The behavior of downstream sanitizers relying on this behavior will also change. Some tests describing the changed behavior are in test/html4/test_comments.rb.

    ... (truncated)

    Changelog

    Sourced from nokogiri's changelog.

    1.13.6 / 2022-05-08

    Security

    • [CRuby] Address CVE-2022-29181, improper handling of unexpected data types, related to untrusted inputs to the SAX parsers. See GHSA-xh29-r2w5-wx8m for more information.

    Improvements

    • {HTML4,XML}::SAX::{Parser,ParserContext} constructor methods now raise TypeError instead of segfaulting when an incorrect type is passed.

    1.13.5 / 2022-05-04

    Security

    Dependencies

    • [CRuby] Vendored libxml2 is updated from v2.9.13 to v2.9.14.

    Improvements

    • [CRuby] The libxml2 HTML parser no longer exhibits quadratic behavior when recovering some broken markup related to start-of-tag and bare < characters.

    Changed

    • [CRuby] The libxml2 HTML parser in v2.9.14 recovers from some broken markup differently. Notably, the XML CDATA escape sequence <![CDATA[ and incorrectly-opened comments will result in HTML text nodes starting with &lt;! instead of skipping the invalid tag. This behavior is a direct result of the quadratic-behavior fix noted above. The behavior of downstream sanitizers relying on this behavior will also change. Some tests describing the changed behavior are in test/html4/test_comments.rb.
    Commits
    • b7817b6 version bump to v1.13.6
    • 61b1a39 Merge pull request #2530 from sparklemotion/flavorjones-check-parse-memory-ty...
    • 83cc451 fix: {HTML4,XML}::SAX::{Parser,ParserContext} check arg types
    • 22c9e5b version bump to v1.13.5
    • 6155881 doc: update CHANGELOG for v1.13.5
    • c519a47 Merge pull request #2527 from sparklemotion/2525-update-libxml-2_9_14-v1_13_x
    • 66c2886 dep: update libxml2 to v2.9.14
    • b7c4cc3 test: unpend the LIBXML_LOADED_VERSION test on freebsd
    • eac7934 dev: require yaml
    • f3521ba style(rubocop): pend Style/FetchEnvVar for now
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Reviewed by dependabot[bot] at 2022-05-19 03:45
  • 14. Add name property on PDFPageFormat

    This PR allows retrieving the name of each page format i.e. A4, B3, US Letter etc. The use case I had for this was wanting to give the user a choice in page format and needing a name to display to them.

    Reviewed by ptrkstr at 2022-04-22 13:32
  • 15. Question: How to overlay on each page?

    Hi, I know about set(_ container: PDFContainer, absoluteOffset: CGFloat)

    to overlay a large text item over a page. How to do this on each page? I want to “watermark” each page with the same text.

    Reviewed by mazz at 2022-04-18 14:09
  • 16. Image size doesn't stays fix even after given fix size

    I am working on creating a pdf with a fix template

    code i have used :

    • document.add(.contentRight, image: PDFImage(image: signImage.resized(withPercentage: 0.4) ?? UIImage(),size: CGSize(width: 180, height: 180), quality: 1.0, options: .none))

    • if there is space at the bottom of page image is seen properly Simulator Screen Shot - iPhone 8 - 2022-01-05 at 11 09 40

    • But if there is little space available at the bottom of the page image gets adjusted there Simulator Screen Shot - iPhone 8 - 2022-01-05 at 11 10 43

    Reviewed by parthmodi605 at 2022-01-05 05:50
A simple generator of PDF written in Swift.

Features | Requirements | Installation | Usage | Communication | LICENSE PDFGenerator PDFGenerator is a simple PDF generator that generates with UIVie

May 31, 2022
An iOS PDF viewer and annotator written in Swift that can be embedded into any application.

Requirements iOS 9 or above Xcode 8 or above Swift 3.0 Note This project is still in early stages. Right now the PDF reader works both programmaticall

Jun 27, 2022
PDF Reader Core for iOS
PDF Reader Core for iOS

PDF Reader Core for iOS This project is no longer supported or maintained. It is only here for historical reasons. Please see the UXReader PDF Framewo

Jun 17, 2022
Small utility to import PDF slides as vector images into Keynote for iOS.
Small utility to import PDF slides as vector images into Keynote for iOS.

Small utility to import PDF files into Keynote for iOS. This utility is especially helpful when presenting slideshows created by LaTeX

Jun 14, 2022
Draw Week Time Table on PDF using PDFKit in iOS Swift
Draw Week Time Table on PDF using PDFKit in iOS Swift

DrawPDFTimeTable Draw Week Time Table on PDF using PDFKit in iOS Swift. Image Info This is the pdf of time table drawn using PDFKit in iOS Swift with

May 31, 2022
SimplePDF is a wrapper of UIGraphics PDF context written in Swift.
SimplePDF is a wrapper of UIGraphics PDF context written in Swift.

SimplePDF is a wrapper of UIGraphics PDF context written in Swift. You can: add texts, images, spaces and lines, table set up page layout, adjust cont

Jun 7, 2022
PDF generator using UIViews or UIViews with an associated XIB

Description Create UIView objects using any method you like, including interface builder with Auto-layout and size classes enabled. Then generate a PD

Aug 28, 2020
Generate beautiful .pdf Files from xib

Description The Library generates a PDF directly from interface builder with Auto-layouted views! Swift Version of UIView_2_PDF. Installation Download

Sep 23, 2021
UIImage PDF extensions.

UIImagePlusPDF UIImage extensions to use PDF files. Using UIImagePlusPDF you can avoid a lot png images files (1x, 2x, 3x sizes) and simply replace ea

Jan 25, 2022
Estrutura Simples para Navegacao Web e Download PDF

Download-PDF-WebView Projeto desenvolvido em Swift com a função de criar uma estrutura simples para navegação Web em seu Aplicativo, permitindo a visu

Nov 30, 2021
PdfBuilder: a swift library made to make creation of the Pdf file from code simpler
PdfBuilder: a swift library made to make creation of the Pdf file from code simpler

PdfBuilder PdfBuilder is a swift library made to make creation of the Pdf file f

Mar 7, 2022
Mephisto - A command line tool to convert Comic Book Zip archives to PDF and share them over AirDrop
Mephisto - A command line tool to convert Comic Book Zip archives to PDF and share them over AirDrop

mephisto A command line tool written in Swift to convert Comic Book Zip archives

Feb 7, 2022
Swift package that uses WebKit to render PDF files from URLs

Swift package for generating a PDF file from a URL (rendered by WebKit)

Feb 25, 2022
About PDFKit learning project on iOS 11, Like iBooks.app.
About PDFKit learning project on iOS 11, Like iBooks.app.

iBook About PDFKit learning project on iOS 11, Like iBooks.app. 书库 书库页面获取PDF相关数据, 可以通过KVC获取。 PDF书名 if let title = documentAttributes["Title"] as? Stri

Jun 23, 2022
📚 A Swift ePub reader and parser framework for iOS.
📚 A Swift ePub reader and parser framework for iOS.

FolioReaderKit is an ePub reader and parser framework for iOS written in Swift. Features ePub 2 and ePub 3 support Custom Fonts Custom Text Size Text

Jun 19, 2022
A Static Library to be embedded on iOS applications to display pdf documents derived from Fast PDF

FastPdfKit This repository contains the FastPdfKit iOS library with some sample projects. FastPdfKit is a library that let you show pdf documents in i

Jun 17, 2022
A simple generator of PDF written in Swift.

Features | Requirements | Installation | Usage | Communication | LICENSE PDFGenerator PDFGenerator is a simple PDF generator that generates with UIVie

May 31, 2022
🗃 Powerful and easy to use Swift Query Builder for Vapor 3.
🗃 Powerful and easy to use Swift Query Builder for Vapor 3.

⚠️ This lib is DEPRECATED ⚠️ please use SwifQL with Bridges Quick Intro struct PublicUser: Codable { var name: String var petName: String

Dec 9, 2021
An easy to use UIAlertController builder for swift

LKAlertController An easy to use UIAlertController builder for swift Features Short and simple syntax for creating both Alerts and ActionSheets from U

Feb 8, 2022
An easy to use UIAlertController builder for swift

LKAlertController An easy to use UIAlertController builder for swift Features Short and simple syntax for creating both Alerts and ActionSheets from U

Feb 8, 2022