Cloudinary Blog
Learn More

Archive for July 2012

Uploading, converting and generating thumbnails for PDF documents

Jul 27, 2012 by Nadav Soferman
Web applications that manage user data, commonly allow their users to upload such data as PDF documents. A common UI practice employed by such services is to show a thumbnail of the PDF cover letter for quick identification, and thumbnails of the different PDF pages for fast access.
 
Using Cloudinary, you can accomplish such tasks with ease. 
 
In this blog post we wanted to showcase some of Cloudinary’s powerful PDF (and multi-page TIFF) management capabilities.
 

Uploading PDF files

From a website’s perspective, PDF assets share many usability characteristics as regular image files, and so we treat them quite the same as images. You can simply use our standard upload API for uploading PDF files.

Ruby on Rails:
Cloudinary::Uploader.upload("SinglePageSample.pdf", :public_id => "single_page_pdf") 
Python:
cloudinary.uploader.upload("SinglePageSample.pdf", public_id = 'single_page_pdf')
Node.js:
cloudinary.uploader.upload("SinglePageSample.pdf", function(result) { }, 
                           {public_id: 'single_page_pdf'})
PHP:
\Cloudinary\Uploader::upload("SinglePageSample.pdf", "public_id" => 'single_page_pdf')
 The uploaded PDF is available for downloading as-is through a fast CDN:
 

This means that if you allow your users to upload images in multiple formats, they could also upload PDFs.

Generating thumbnails

To generate images and thumbnails from your PDF file, you can simply use Cloudinary’s resize and crop transformations, as you would for regular images.

For example, the following URL converts a PDF into a PNG image, as a 200x250 pixels thumbnail:


 
Same example in Rails: 
<%= cl_image_tag("single_page_pdf.png", :width => 200, :height => 250, :crop => :fill) %>
You can also apply any of Cloudinary’s powerful transformations on your PDFs. For example, here is the same page, but this time rotated and converted to grayscale with a watermark added:
 

 
 
While you can generate any thumbnail your graphics design requires, you can also dynamically generate and deliver a full sized image version of your PDF. To control the image’s quality, you can state the density (DPI) used to convert the PDF to an image. Simply use the new 'density' transformation parameter (or 'dn' for URLs) with an integer value between 1 and 300 (the default is 150).
 
The following examples generate a low density and a high density image versions of the uploaded PDF:
 
 
Same example in Rails:
<%= cl_image_tag("single_page_pdf.png", :density => 50) %>
  

Multi-page support

In the examples above, we’ve shown how to generate an image version of the first page of the PDF. But what about multi-page documents
 
You’ll be happy to hear that Cloudinary allows you to generate images and thumbnails for any page of a multi-page document. You can also use the same APIs to manage multi-page TIFF files.
 
In order to extract a single page out of a document, use the new 'page' parameter (or 'pg' for URLs).
 
The following example delivers a 200x300 JPG thumbnail created from the second page of the 'multi_page_pdf' PDF file.
 
 
 
Same example in Rails:
<%= cl_image_tag("multi_page_pdf.jpg", :width => 200, :height => 250,
                 :crop => :fill, :page => 2) %>
In the following example we also reduced quality to 50% to generate a smaller file that can be downloaded faster.
 
 
 

Tips and tricks

Cloudinary offers many additional features in the PDF management department, and you can also mix and match these with all of Cloudinary’s existing image manipulation and delivery capabilities. Following are a few quick ideas.
 
Using Cloudinary, it is easy to extract a single page from a multi-page PDF while returning it as a new PDF:
 
You can also convert arbitrary images to PDFs. For example, consider the following image depicting grazing horses:
 
 
Simply change this image’s suffix to .PDF and Cloudinary will convert the image to PDF and return it as a PDF file.
 
Cloudinary can even programmatically tell you how many pages are available in an uploaded PDF. Our upload API returns this number as its 'pages' parameter:
{  
"public_id":"multi_page_pdf",
"version":1343305663,
"width":612,
"height":792,
"format":"pdf",
"pages":3,
"url":"http://res.cloudinary.com/demo/image/upload/v1343305663/multi_page_pdf.pdf",
...
}
You can also upload a PDF as JPG, storing only the JPG on Cloudinary. This will require less storage and make sure that the image is available immediately on upload, rather than created lazily on demand. The following code sample converts an uploaded PDF to JPG while uploading, before storing it in the cloud and generating additional transformed versions. 

PHP:
\Cloudinary\Uploader::upload("SinglePageSample.pdf", "public_id" => 'single_page_pdf', 
                             "format" => 'jpg')
As usual with Cloudinary, all generated images, documents and thumbnails are cached and delivered through thousands of worldwide CDN servers (currently leveraging Amazon CloudFront).
 
PDF upload, thumbnail creation and transformations, together with multi-page document support, are all available now for both of our free and paid plans. Click here to quickly set up an account if you don't already have one.
 

Heroku add-on for image management in the cloud

Jul 20, 2012 by Itai Lahan

When we first started developing web apps with Ruby on Rails, some six years ago, we struggled with finding a good IDE. We settled for Eclipse with RadRails (still developing on PCs at that time...), but kept our eyes open for new and promising IDEs. At late 2007, a very surprising contender caught our eyes, it was called ‘Heroku’ and it offered an amazing concept - a fully featured IDE for Ruby-on-Rails that was completely online, available through your favorite browser.

In addition to collaborative online code editing, Heroku sought to revolutionize the way you deploy your Rails applications. Instead of messing around with a lengthy deployment process, heroku offered to deploy your Rails applications to the cloud in just a few clicks.

The huge benefits for the Rails community has drove Heroku to focus its whole attention at Cloud-based deployments, offering one of the most effective PaaS (Platform as a service) solutions at that time. Heroku soon extended their support to Node.js, Clojure, Java, Python, and Scala.

Two years later, Heroku added yet another disruptive feature to their platform - add-ons. With add-ons, any cloud service provider could integrate with Heroku, offering its service through the Heroku platform. New add-ons get listed on Heroku’s portal, and Heroku users can extend their existing applications with new cloud services in virtually one click.

When we started working on Cloudinary, we knew that we must develop a Cloudinary add-on for Heroku. Allowing web developers to integrate with our Cloud-based image management solution with just a single click was simply a too important opportunity to miss. 

After a lengthy testing phase, we’re happy to report that the Cloudinary’s Heroku add-on is finally available to the general public

Notes

To setup a Cloudinary account, simply select the plan that matches your needs from the list of plans. You can upgrade to plans with higher usage limits at any time.

You can also do it from the command line. For example, the following line signs up to the Bronze plan:

heroku addons:add cloudinary:bronze

With Cloudinary’s client libraries for Ruby on Rails, Node.js and Python, integrating with Heroku is quite seamless. Heroku automatically defines the CLOUDINARY_URL environment variable in your deployed applications. This variable is processed by our client libraries for configuring your cloud name and access identifiers. Here is a sample CLOUDINARY_URL for example:

cloudinary://123456789012345:abcdeghijklmnopqrstuvwxyz12@n07t21i7

In addition, Cloudinary also offers straightforward URL-based APIs for simple integration with any web development platform out there.

Check out our Heroku documentation page for detailed usage instructions.  

After you setup your Cloudinary add-on, make sure you check out our Management Console. Through the console you can browse all uploaded images and transformations, view usage statistics and charts, grab your access identifiers and modify your account settings. To reach your management console, just head to the Heroku portal, select your app, and select Cloudinary from the Add-ons drop-down menu on the top right corner. 

Heroku Menu

Console

Heroku users - why don't you try out our new add-on? We would love to hear your feedback.

Automatic backup of user uploaded images using Cloudinary

Jul 18, 2012 by Nadav Soferman
As a website owner, you know the importance of having a robust web-based service. When a downtime may result in lost revenues, you strive to keep a highly available online solution.
 
A major part of having a robust service is a good contingency plan, that ultimately depends on regular backups of your website’s data. Your website’s code is probably backed up regularly, and so is your database, but have you given thought to backing up your dynamic website assets, such as your users’ uploaded images? 
 
Until today, using Cloudinary as-is would have gotten you most of the way there. Cloudinary offers a simple way for you to upload your website’s images and other resources to the cloud, offering high availability and robust delivery, that usually surpasses the capabilities of local hosting solutions. Even if a cloud-based hardware is damaged, its virtual nature makes sure that the data is kept safe and can be easily and transparently migrated to a replacement hardware.
 
But what about user errors, code mishaps and targeted attacks? A website user and even your admin might accidentally erase a critical user uploaded image. A vulnerability in your application may allow an attacker to perform mass deletion of images or replacing them with alternative content. How can these issues be thwarted?
 
Today, we are happy to announce Cloudinary’s new backup feature. This new feature addresses all the issues we’ve listed, while offering many additional benefits. 
 
From now on, in addition to safely storing uploaded images in a cloud based storage (Amazon’s S3 service), images can be automatically backed up to a safer location, where no casual API calls can penetrate. In addition, Cloudinary keeps multiple revisions for each uploaded resource for even greater robustness.
 

Enabling global and selective backups

Since backing up resources requires extra storage space, we made it optional. By default, backup is turned off.
 
To enable backup of your Cloudinary-managed resources, simply head to your management console and enable backup through the settings page. Changes will take effect immediately for all newly uploaded images.
 
Settings
 
To keep your costs down, Cloudinary’s new backup solution makes sure it backs up only your unique resources. Remotely fetched images, such as Facebook and Twitter profile pictures, are not backed up because they can be automatically re-created at any time. In addition, Cloudinary keeps backup copies only for your original images and not of the derived (transformed) versions of these originals, as these too can be re-generated on demand.
 
In addition to global backup, you can also selectively enable backups for specific, important files. To do this, simply specify the new 'backup' parameter in upload API calls. Below are some examples:
 
Ruby on Rails:
Cloudinary::Uploader.upload("my_file.png", 
                            :public_id => "my_file", 
                            :backup => true)
PHP:
\Cloudinary\Uploader::upload("my_file.png", 
                             "public_id" => 'my_file', 
                             "backup" => true)
Python:
cloudinary.uploader.upload("my_file.png", 
                           public_id = 'my_file', 
                           backup = True)
Node.js:
cloudinary.uploader.upload("http://www.example.com/image.jpg", 
    function(result) { console.log(result) }, 
    { public_id: 'sample_remote', backup: true })
Make sure you upgrade to our latest client libraries to ensure the backup support.
 

Backed-up resource browsing 

While browsing images using our management console you’ll notice that backed-up resources are now marked with a small safe icon. If the icon is red it means that a file has additional historical revisions.
 
Backup images
 
Clicking on the safe icon will list all revisions, allowing you to download historical versions of a backed-up resource.
 
Backup revisions
 
Deleted backed-up images are listed as well. They are grayed out and marked as non existing. You can still click the safe icon to download the deleted image backup.
 
Backup deleted
 

Backup solution availability

The automatic backup feature is now available for all free and paid plans of Cloudinary with no extra charge. 
 
If you use our Advanced paid plans (UPDATE) any of our paid plans, you can even choose to store all backed-up files on your own S3 bucket, instead of Cloudinary’s.
 
To summarize, Cloudinary’s new backup capability is an important tool in your robustness arsenal. It is another important step in making Cloudinary a complete, well-rounded solution to your website’s entire image management needs. 
 
We would love to hear your thoughts on this new feature. Use the comment thread below to share them.