The General Data Protection Regulation (GDPR) is the new legal framework of data protection across the EU. Starting 25th May 2018 it will be enforceable. This post clarifies how CloudConvert complies with the GDPR and what our customers can do to be compliant.

In the terms of the GDPR, CloudConvert takes two different roles: CloudConvert is classed as data controller, if it provides services to end customers and directly collects or processes personal data. CloudConvert is classed as processor, if it processes data on behalf of a data controller (typically a customer of CloudConvert).

 

CloudConvert as data controller

This is typically the case when CloudConvert collects your name, email address and address for managing accounts and for billing. Also, it applies when you use the CloudConvert service as end customer and upload files, which contain personal data. CloudConvert has already updated its privacy policy to explain in more detail which data we collect and share. In the coming weeks, there will be some more updates of our privacy policy.

In short, we do collect:

  • Your IP address and times of access
  • Name, email address and photo if you create an account
  • Billing address and payment information if you buy a package or if you subscribe

We do share:

  • Your billing address and payment information with our payment provider Stripe
  • Your IP address, time of access, browser agent, and referrer with Google Analytics

CloudConvert commits to:

  • Not to mine or collect any data from your uploaded files
  • No sharing or copying of your uploaded files
  • Irreversible deletion of your uploaded files within 24 hours (or immediately, if you manually use the delete button)

For details, please read our updated privacy policy.

CloudConvert as processor

If you are an organisation and use CloudConvert to process your customers files, we are typically acting as processor. This is the case if you collect personal data and send them to us for conversion, for example via our API.

As a processor, CloudConvert commits to:

  • Processing provided personal data solely in accordance with your instructions. CloudConvert will never process or share your data for any other purposes.
  • Keeping your data inside the EU.
  • Applying strict security standards to provide a high level of security.
  • Implementing technical and organizational measures in accordance to Art. 32 GDPR.
  • Reporting any data breach to you without “undue delay”.
  • Solely using subcontractors that comply with the GDPR and have signed appropriate contractual agreements.
  • Helping you meet your own regulatory obligations, by providing you with adequate documentation of our services.

In accordance to Art. 28 GDPR it is possible to sign a data processing agreement with us. This binds us legally to the proper processing of data in accordance to the GDPR. Therefore, contact us.

The CloudConvert website / HTML to PDF, JPG and PNG converter is often used to generate PDF files or thumbnails.  Currently, we are using a proven, WebKit-based engine. However, there are use cases that require an even more modern rendering. We are currently experimenting  with automating the Chrome browser for this matter.

There is a new option available to enable Chrome for converting HTML files or websites. This option is named “use_chrome” when using our API.

Please note that currently not all of the pre-existing options are available when using Chrome instead of the current engine. The possible options are:

When converting to PDF:

  • Page orientation
  • Custom page size (defaults to A4)
  • Page margins
  • Zoom factor

When converting to JPG/PNG:

  • Screen width (defaults to 1024)
  • Screen height (defaults to fir the content height)
  • Zoom factor
  • Resize to specific size

We are looking forward to get your feedback about this new feature. In particular we are interested if there are any formatting issues or if there are required options missing.

 

 

AWS Lambdalambda is an event-driven compute service which runs your code (Lambda functions) in response to events, such as changes to data in an Amazon S3 bucket. The CloudConvert API can be used to automatically convert all files, added to a specific S3 bucket. Typical use cases are converting all office documents to PDF, creating thumbnails or encoding videos.

We have created a GitHub repository with an example Lambda function. To get it running, follow these instructions:

  • Download / Fork the repository
  • Run npm install
  • Adjust convert.js according to your needs:
    • Set CLUDCONVERT_API_KEY to your personal API key.
    • Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY for downloading and uploading from/to your S3 bucket.
    • Adjust the conversion paramaters, such as outputformat according to your need. All possible options can be identified using the API Console.
  • Create a ZIP file which contains convert.js and the node_modules folder.
  • In the AWS Console create a new Lambda function. Select Blank Function blueprint.
  • Select S3 trigger and your bucket. Set Event Type to PUT. Adjust Prefix and Suffix to trigger for specific files only.
    lambda_trigger
  • Choose a name for your Lambda function and use Node.js 4.3 as Runtime. Upload your previously created ZIP file as Lambda function. The Handler name needs to be convert.handler. The lambda function does not need any specific permissions: you can create a new empty role.
    lambda_function
  • A timeout value of 10 seconds should be sufficient. Please note that the lambda function only triggers the actual conversion and terminates as soon as the conversion was started. Therefore the timeout does not affect the time needed for the actual conversion.
  • Done! You can test your Lambda function by adding a new file to your S3 bucket.

zapierWe 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!

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.

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.

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.

 

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!

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 🙁

We think in times of cloud computing you cannot categorize payments in fixed packages. We do not want to force our customers in buying or subscribing for 1000, 5000, or 10000 conversion minutes. From now on our customers can completely customize their prepaid packages and subscriptions and scale them according to their needs. If you want to subscribe for monthly 2222 conversion minutes, you can do so! Checkout our pricing site with the new sliders for your personal customization.