暗号化されたPDFをCloudinaryにアップロードするには

Cloudinary に PDF をアップロードしたけど、失敗した!という場合、ファイルがパスワード保護または暗号化されていないか確認してみてください。その場合のアップロード方法もご紹介します。
2023.05.10

TL; DR

Cloudinaryにログインして、メディアライブラリからパスワード保護されたPDFをアップロードしたら、失敗しました。さて、どうすればいいでしょう?

API を使って resource_typeRAW に指定することでアップロードができました。

検証やってみた

準備

MacBook環境です。パスワード保護されたPDFファイルを準備します。

対象となるPDFファイルをPreviewで開き、File から Edit Permissions を選択。

パスワードを設定します。上部がファイルを開く際のパスワード、下部が所有者パスワードです。

これでOK!次からファイルを開くときはパスワード入力が求められます。

アップロード

まずは普通にアップロードしてみます。

ブラウザでログインして、Media Libraryにドラッグ&ドロップしてみると、画面右下に冒頭のスクショのような失敗ステータスが表示されて終わります。

では、「Upload」をクリックして Upload Widget からやってみましょう。

残念ながら、Advanced をクリックしても追加で設定できるのはアセット名とタグ付けのみ。ファイルを選択したら直ちにアップロードが開始し、先ほどと同様に失敗します。


次に、APIで普通にアップロードします。

# -*- coding:utf-8 -*-
import cloudinary, cloudinary.uploader
from pprint import pprint

cloudinary.config(
	cloud_name = CLOUD_NAME,
	api_key = API_KEY,
	api_secret = API_SECRET
)

res = cloudinary.uploader.upload("/Users/itom/Downloads/test/invoice.pdf",
	public_id = "test-invoice2")

pprint(res)

すると

cloudinary.exceptions.Error: Password-protected PDFs are not supported

と怒られました。

でも大丈夫!この記事を見てください↓

Encrypted PDF file upload error - Cloudinary Forum

暗号化やパスワードで保護されたPDFをアップロードする場合は、ResourceTypeを "Raw"に指定してアップロードする必要があります。デフォルトでは、PDFをアップロードすると、画像と同じ変換の操作ができるため、ResourceTypeが "Image"に設定されます。しかし、パスワードや暗号化により、Cloudinaryではファイルを開いて変更することができません。 Rawとしてアップロードすれば、これらのPDFをアップロードして配信することができますが、パスワードで保護されたPDFを操作することはできません。

デフォルトの image ではなく、raw のリソースタイプを使えばパスワード保護されたPDFもアップロードすることができるのです。


ということで、リソースタイプを指定してアップロードしてみましょう。

上述のコードでアップロード部分を以下のように変更します。

res = cloudinary.uploader.upload("/Users/itom/Downloads/test/invoice.pdf",
	public_id = "test-invoice2",
	resource_type = "raw")

無事にアップロード成功のレスポンスが返ってきました!

{'access_mode': 'public',
 'api_key': '371428275358718',
 'asset_id': 'ba26045305f094f51cc18d1e2a56984c',
 'bytes': 115215,
 'created_at': '2023-05-10T10:34:59Z',
 'etag': '35c97abc680c131b2dc8c34e5d533eb7',
 'folder': '',
 'original_filename': 'invoice',
 'overwritten': True,
 'placeholder': False,
 'public_id': 'test-invoice2.pdf',
 'resource_type': 'raw',
 'secure_url': 'https://res.cloudinary.com/CLOUD_NAME/raw/upload/v1683718613/test-invoice2.pdf',
 'signature': '87ff7239b6cd8c95c507633223d6b88f16e13ef0',
 'tags': [],
 'type': 'upload',
 'url': 'http://res.cloudinary.com/CLOUD_NAME/raw/upload/v1683718613/test-invoice2.pdf',
 'version': 1683718613,
 'version_id': 'c87657dec06a2cff4fd5380ffbb221f1'}

ブラウザで確認

ブラウザでURLを開いてみると、下のようにパスワード保護画面が出て、パスワードを入力するとちゃんとファイルを表示させることができました。

留意点

  1. パスワード保護されていない普通に開けるPDFファイルでも、256-bitで暗号化されたファイルは同様(※)です。ファイルのメタデータを確認してみてください。
  2. RAWでファイルをアップロードした場合、配信URLのパスが /image/uploadではなく/raw/uploadとなります。もしフロント側の社内システムなどでURLを手動で生成している場合は、/image/upload の固定値を使っていないかご確認ください。
  3. RAWのファイルには変換を適用させることができません。リソースタイプは後から変更ができず、変換したい場合はファイルの再アップロードが必要です。パスワード保護・暗号化がなく変換を適用させるかもしれないPDFは、デフォルトの image でアップロードしてください。

※ Cloudinaryサポートによると、現時点で本ケースが当てはまるのは、ファイルを開くのにパスワード保護されたファイルと、(パスワード保護に関わらず)256 ビットで暗号化されたファイルです。パスワード保護のない、128 bit 以下の暗号化の場合には、通常のアップロードが可能です。(2023年5月11日更新)

PDF ファイルの暗号化と確認については、詳しくは下記ブログから:

CloudinaryのPDF配信

暗号化やパスワード保護のされていない PDF であれば、Media Library やAPIで特にリソースタイプを指定せず image でアップロードされることで、様々な変換が活用できます。

以下、Cloudinaryで使えるPDFの機能をまとめます。

  • page パラメータでファイルのページを指定
  • 特定のページに対して画像の変換パラメータを適用(例: width, height, crop でサイズ切り抜き、末尾にjpgやpngを指定して異なるフォーマットに)
  • multi メソッドを使って、Cloudinary 上にある特定タグの付く画像をまとめてPDF作成
  • Aspose Document Conversion アドオンを使って、Cloudinary 上の Word、Excel、PowerPoint ファイルからPDF作成
  • OCR 文字認識・抽出アドオンを使って、ファイル内の文字から自動タグ付け
  • fl_rasterize パラメータで、ファイルサイズの変更やオーバーレイ追加などPDFのままラスタライズ

詳細・例はこちらのブログから。

以上です!ぜひ試してみてくださいね。