gpt4 book ai didi

android - 为 Firebase 生成 PDF 缩略图

转载 作者:搜寻专家 更新时间:2023-11-01 07:43:26 24 4
gpt4 key购买 nike

我正在开发一个管理 PDF 的 Android 应用程序。我知道 Cloudinary 允许用户上传 PDF 并自动为上传的 PDF 生成缩略图(参见 here )。 Firebase StorageCloud Firestore 是否提供类似的功能?如果没有,是否推荐用于此任务的第三方工具?谢谢!

最佳答案

简介

ImageMagick 预装在云函数环境中,但 Ghostscript 没有(至少现在没有)。 Ghostscript 是从 PDF 生成图像所需要的。

首先,从here 下载Ghostscript 可执行文件的副本。 (linux 64 位 APGL 版本),并将其存储在函数目录的根目录中。您可能想要重命名文件夹/可执行文件名称以获取更短的路径引用。这将在您部署函数时部署。

第二个见 this repo , npm install —-save https://github.com/sina-masnadi/node-gs/tarball/master 。这是一个包装器,您需要从您的函数中与 Ghostscript 可执行文件进行通信。

第三,您可能需要查看 Ghostscript/ImageMagick进一步自定义的文档。

示例云函数

最后,这是我刚刚为我的 函数文件结构工作的函数。您需要编写更好的验证并为您的设置调整它,但要知道它的核心是可行的。

const admin = require('firebase-admin');
const functions = require('firebase-functions');
const fs = require('fs');
const os = require('os');
const path = require('path');
const write = require('fs-writefile-promise');
const spawn = require('child-process-promise').spawn;
const mkdirp = require('mkdirp-promise');
const gs = require('gs');
const gs_exec_path = path.join(__dirname, '../../../ghostscript/./gs-923-linux-x86_64');

try { admin.initializeApp(functions.config().firebase); } catch(e) {}


/*
Callable https function that takes a base 64 string of a pdf (MAX
10mb), uploads a thumbnail of it to firebase storage, and returns its
download url.
*/
module.exports = functions.https.onCall((data, context) => {
if (!data.b64str) { throw Error('missing base 64 string of pdf!'); }

const b64pdf = data.b64str.split(';base64,').pop();
const pg = typeof data.pg === 'number' ? data.pg : 1; //1-based
const max_wd = typeof data.max_wd === 'number' ? data.max_wd : 200;
const max_ht = typeof data.max_ht === 'number' ? data.max_ht : 200;
const st_fname = typeof data.fname === 'string' ? data.fname : 'whatever.jpg';

const bucket = admin.storage().bucket();
const tmp_dir = os.tmpdir();
const tmp_pdf = path.join(tmp_dir, 'tmp.pdf');
const tmp_png = path.join(tmp_dir, 'doesntmatter.png');
const tmp_thumb = path.join(tmp_dir, st_fname.split('/').pop();
const st_thumb = st_fname;

/* create tmp directory to write tmp files to... */
return mkdirp(tmp_dir).then(() => {
/* create a temp pdf of the base 64 pdf */
return write(tmp_pdf, b64pdf, {encoding:'base64'});
}).then(() => {
/* let ghostscript make a png of a page in the pdf */
return new Promise((resolve, reject) => {
gs().batch().nopause()
.option(`-dFirstPage=${pg}`)
.option(`-dLastPage=${pg}`)
.executablePath(gs_exec_path)
.device('png16m')
.output(tmp_png)
.input(tmp_pdf)
.exec(err => err ? reject(err) : resolve());
});
}).then(() => {
/* make a thumbnail for the png generated by ghostscript via imagemagick */
var args = [ tmp_png, '-thumbnail', `${max_wd}x${max_ht}>`, tmp_thumb ];
return spawn('convert', args, {capture: ['stdout', 'stderr']});
}).then(() => {
/* upload tmp_thumb to storage. */
return bucket.upload(tmp_thumb, { destination: st_thumb });
}).then(() => {
/* get storage url for the uploaded thumbnail */
return bucket.file(st_thumb).getSignedUrl({
action:'read',
expires: '03-01-2500'
});
}).then(result => {
/* clean up temp files and respond w/ download url */
fs.unlinkSync(tmp_pdf);
fs.unlinkSync(tmp_png);
fs.unlinkSync(tmp_thumb);
return result[0];
});
});

客户端调用示例

var fn = firebase.functions().httpsCallable('https_fn_name');

fn({
b64str: 'base64 string for pdf here....',
pg: 2, //optional, which page do u want a thumbnail of? 1 is the first.
fname: 'path/to/file/in/storage.jpg', //optional but recommended, .png if u like
max_wd: 300, // optional, max thumbnail width
max_ht: 300 // optional, max thumbnail height
}).then(res => console.log(res));

如果您无法生成签名 url...

您需要将角色“Cloud Functions Service Agent”添加到此功能正在使用的任何服务帐户。您可以在 cloud console 中将角色添加到您的服务帐户。 .

How to add the role

关于android - 为 Firebase 生成 PDF 缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50047526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com