Jun 7, 2016

OpenStack, Microsoft Azure and Google Cloud Integration

Our Amazon S3 integration is a well used feature. Besides S3 we now have integrated OpenStack Storage (Swift), Microsoft Azure File Storage and Google Cloud Storage. You can use any of these file storage solutions as input and output for CloudConvert conversions. Our API Console has been updated and can be used to live-test the new storage options.



Feb 26, 2016

Zapier Integration

We are happy to announce that CloudConvert is now fully integrated with Zapier! Using Zapier you can connect CloudConvert to 500+ other Apps like Evernote, Basecamp, Gmail, Trello, Slack and so many others. Below you can find some ideas for possible "Zaps".

We are looking forward to see your workflows and use cases for Zapier!


Feb 1, 2016

Improved file uploading API

We did a lot of improvements on our API regarding input file uploads. Previously you had to embed the file together with all your parameters in a single multipart/form-related POST request. Although such multipart requests are widely used, implementing them is often pretty inconvenient. Therefore we decided to provide an alternative way of uploading the input files. In short you can use now a simple PUT requests to a designated upload url and send the actual file content as body of your request. Checkout our updated API documentation for details.

Using a designated upload url has another advantage: If your input files are provided by your users, you can now let them upload their files directly to CloudConvert. This avoids the time consuming process of uploading the files to your server first and afterwards sending them to us. We have updated our PHP wrapper with an example on how to use this:

<?php
require __DIR__ . '/vendor/autoload.php';
use \CloudConvert\Api;
$api = new Api("your_api_key");
 
$process = $api->createProcess([
 'inputformat' => 'png',
 'outputformat' => 'jpg',
]);
 
$process->start([
 'input' => 'upload',
 'outputformat' => 'jpg',
 'converteroptions' => [
   'quality' => 75,
 ],
 'callback' => 'http://_INSERT_PUBLIC_URL_TO_/callback.php'
]);
?>
<form action="<?=$process->upload->url?>" method="POST" enctype="multipart/form-data">
 <input type="file" name="file">
 <input type="submit">
</form>

Don't worry - as always, our API stays full backward compatible. If you are using the old method of uploading files, nothing needs to be changed. Our suggestion of using the new method only applies to new implementations.


Nov 27, 2015

Python API Wrapper

We just pushed the official Python API Wrapper to Github. Using it you can do cool stuff with just a few lines of code:

import cloudconvert
 
api = cloudconvert.Api('your_api_key')
 
process = api.convert({
    'inputformat': 'html',
    'outputformat': 'pdf',
    'input': 'upload',
    'file': open('input.html', 'rb')
})
process.wait() 
process.download("output.pdf") 

As always, you can create ready to use code snippets using the API console.


Nov 25, 2015

Dynamic PDF creation using DOCX templates

When creating PDF files from DOCX or PPTX files CloudConvert can now dynamically change the content. This feature makes it more convenient to create invoices or mass letters dynamically. Technically you set up a DOCX template with placeholders (for example ${name}). While converting the DOCX file to PDF CloudConvert can replace these placeholders with custom values. This even works for tables with a variable amount of rows as the following example shows.

undefined


The shown PDF was created using the DOCX template file and these few lines of PHP code:

$api->convert([
    "input" => "upload",
    "inputformat" => "docx",
    "outputformat" => "pdf",
    "converteroptions" => [
       "templating" => [
          "name" => "John Smith",
          "address" => "Smithstreet 1",
          "city" => "Smithtown",
          "zip" => "10101",
          "country" => "US",
          "comment" => "Thanks for your business!",
          "date" => "2015-11-24",
          "total" => "160",
          "items" => [
            ["description" => "Nameless product", "price" => "10", "quantity" => "2", "total" => "20"],
            ["description" => "Other product", "price" => "100", "quantity" => "1", "total" => "100"],
            ["description" => "Stuff", "price" => "2", "quantity" => "20", "total" => "40"],
            ],
        ],
    ],
    "file" => fopen('template.docx', 'r'),
])

Checkout the full Syntax for the placeholders of the new templating feature.

We think this feature is a great step to make CloudConvert even more powerful and we hope you like it!


Nov 25, 2015

Syntax for the DOCX / PPTX templating feature

The syntax is highly inspired by Mustache. The template is created in Microsoft Word/PowerPoint or any equivalent that saves to DOCX/PPTX. Also checkout this example of using the templating feature.

Synopsis

A typical DOCX template:

Hello {name} !

Given the following value for the templating JSON dictionary:

{ name:'Edgar'}

Will produce:

Hello Edgar !

Tag types

Like Mustache, it has the loopopening {#} and loopclosing {/} brackets

Loop syntax

The following template:

{#products}
    {name}, {price} €
{/products}

Given the following JSON dictionary:

{
    "products":
        [
         {name:"Windows",price:100},
         {name:"Mac OSX",price:200},
         {name:"Ubuntu",price:0}
        ]
}

will result in :

Windows, 100 €
Mac OSX, 200 €
Ubuntu, 0 €

The loop behaves in the following way:

  • If the value is an array, it will loop over all the elements of that array.
  • If the value is a boolean, it will loop once if the value is true, keeping the same scope, and not loop at all if the value is false

Note: Because the loops work also with boolean values, you can also use them for conditions.


Raw XML syntax

Sometimes, you would like to insert your custom XML (a complex table, a formula, ...)

With the RawXML syntax the variable is interpreted as XML and replaced in the formula

{@rawXML}

with this data:

{rawXml:'<w:p><w:pPr><w:rPr><w:color w:val="FF0000"/></w:rPr></w:pPr><w:r><w:rPr><w:color w:val="FF0000"/></w:rPr><w:t>My custom</w:t></w:r><w:r><w:rPr><w:color w:val="00FF00"/></w:rPr><w:t>XML</w:t></w:r></w:p>'}

This will loop over the first parent tag

Inverted Selections

An inverted section begins with a caret (hat) and ends with a slash. That is {^person} begins a "person" inverted section while {/person} ends it.

While sections can be used to render text one or more times based on the value of the key, inverted sections may render text once based on the inverse value of the key. That is, they will be rendered if the key doesn't exist, is false, or is an empty list.

Template:

{#repo}
  <b>{name}</b>
{/repo}
{^repo}
  No repos 🙁
{/repo}

Value for the templating JSON dictionary:

{
  "repo": []
}

Output:

No repos :(