Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Prawn: Fast, Nimble PDF Generation For Ruby

Gem VersionBuild StatusCode ClimateMaintained: yes

Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide:

  • Vector drawing support, including lines, polygons, curves, ellipses, etc.
  • Extensive text rendering support, including flowing text and limited inline formatting options.
  • Support for both PDF builtin fonts as well as embedded TrueType fonts
  • A variety of low level tools for basic layout needs, including a simple grid system
  • PNG and JPG image embedding, with flexible scaling options
  • Security features including encryption and password protection
  • Tools for rendering repeatable content (i.e headers, footers, and page numbers)
  • Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping.
  • Support for PDF outlines for document navigation
  • Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification)
  • Lots of other stuff!

Should You Use Prawn?

If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things.

One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into Ferrum. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents.

Supported Ruby Versions and Implementations

Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support all Ruby versions suported by Ruby Core Team and JRuby versions of matching Ruby version. However we will accept patches to fix problems on other Ruby platforms if they aren't too invasive.

Installing Prawn

Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing gem install prawn on the command line.

You can also install from git if you'd like, the master branch contains the latest developments. We're trying to keep master branch in working order but you may encounter some rough edges and fresh bugs along with bugfixes. We encourage you to try master branch with your application.

Hello World!

If the following code runs and produces a working PDF file, you've successfully installed Prawn.

require"prawn"Prawn::Document.generate("hello.pdf")dotext"Hello World!"end

Of course, you'll probably want to do more interesting things than that...

Manual

The manual is a series of examples that demonstrate use of the wide range of features Prawn provides. You can get a generated version of the latest released Prawn version on the Prawn website. The examples themselves can be found in the manual directory in this repository.

Please note that while the manual is a great introduction and guide to Prawn it's not exhaustive. Please refer to API docs for more complete information on what Prawn provides and how to use it.

To build the manual, here's what you need to do:

  1. Clone the repository
  2. Run gem install -g
  3. Run rake manual, which will generate manual.pdf in the project root

Release Policies

We're trying to not break things unnecessarily but we don't formally follow Semantic Versioning. The reason is that we release a number of experimental APIs. We don't make any promises on their stability. You can assume the stable portion of the API follows Semantic Versioning.

Also note that bug fixes can change behaviour. We don't consider that to be a breaking change for the purposes of versioning. Please test your applications after updating Prawn.

Be sure to read the release notes in CHANGELOG.md each time we cut a new release, and lock your gems accordingly.

Support

The easiest way to get help with Prawn is to post a message to our Discussions.

Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on.

Please make your posts as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be.

Code of Conduct

Prawn adheres to the Contributor Covenant. Unacceptable behavior can be reported to conduct@prawnpdf.org which is monitored by the core team.

Contributing

If you've found a bug or want to submit a patch, please enter a ticket into our GitHub tracker.

We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged.

If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list.

You can run our test suite in a few different ways:

  1. Running rake will run the entire test suite excluding any unresolved issues
  2. Running rspec will run the entire test suite including unresolved issues
  3. Running rspec -t unresolved will run only unresolved issues
  4. Running rspec -t issue:NUMBER will run the tests for a specific issue

These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run.

Maintenance team

Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the years. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors.

That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project.

Current maintainers

These are the folks to contact if you have a maintenance-related issue with Prawn:

Inactive maintainers

These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project:

License

Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files.

If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself.

History

Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project.

Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on GitHub Contributors page.

After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company).

About

Fast, Nimble PDF Writer for Ruby

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages