Day13 - PDF 加密、解密的处理

前言

在处理 PDF 增加密码 (加密) 、移除解密 (解密) 时,可以使用 Ghostscript 处理,若不熟悉,可以先看下 wiki官方文件的介绍

实作

首先需要先安装 ghostscript

# for macOS
brew install ghostscript

这边提供范例 PDF ,和实作的 pr,参数细节设定,可以参考官方文件

# app/services/processing_pdf.rb

class ProcessingPdf
  # ghostscript Documentation: https://www.ghostscript.com/doc/current/Use.htm

  def self.encryption(pwd, input_file, output_file)
    _stdout_str, _stderr_str, _status = Open3.capture3("gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dNOPROMPT -dQUIET \
                                                        -sOwnerPassword=#{pwd} -sUserPassword=manan \
                                                        -sOutputFile=#{output_file} #{input_file}")

    { success: true, msg: 'PDF加密完成' }
  end

  def self.decrypt(pwd, input_file, output_file)
    _stdout_str, stderr_str, _status = Open3.capture3("gs -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE \
                                                       -SPDFPassword=#{pwd} -sOutputFile=#{output_file} \
                                                       -c 30000000 setvmthreshold -f #{input_file}")

    return { error_msgs: stderr_str.remove("\n") } if stderr_str.present?

    { success: true, msg: 'PDF解密完成' }
  end
end

将加密、解密写在 services,方便之後使用,以下为实际测试加解密 PDF

# rails console

source_pdf = Rails.root.join("data/river_demo_pdf.pdf")
encryption_pdf = Rails.root.join("data/set_password_river_demo_pdf.pdf")
password = "river_test"

# 加密 PDF
encryption_result = ProcessingPdf.encryption(password, source_pdf, encryption_pdf)

# 解密 PDF
input_pdf = encryption_pdf
output_pdf = Rails.root.join("data/decrypt_river_demo_pdf.pdf")
decrypt_result = ProcessingPdf.decrypt(password, input_pdf, output_pdf)

# 处理解密时,若遇到输入密码错误,要在自行处理

示范的 PDF

加密後的 PDF (开启时,会要求输入密码)

小结

之前不知道 Ghostscript 前,会找各种 Gems 看是否有好用的解决方案,後来得知这套知名的老牌软件後,支援的平台挺广泛的,直接用这套就能搞定了~

参考资料

  1. Ghostscript 官网

铁人赛文章连结:https://ithelp.ithome.com.tw/articles/10271819
medium 文章连结:https://link.medium.com/JoYN5HDVPjb
本文同步发布於 小菜的 Blog https://riverye.com/

备注:之後文章修改更新,以个人部落格为主


<<:  Day23 | Livewire 实作 购物网站(二): 建立商品细节页面

>>:  D18 - TiDB备份还原

Day 25 : 可解释的 AI - Explain AI (XAI)

AI 黑箱作业已经被诟病许久,因为 AI 类神经网络的复杂性不似机械学习的树状结构、线性结构容易理...

【Day28】反馈元件 - Modal

元件介绍 Modal 元件为弹出相关元件提供了重要的基础建设,如 Dialog、Popover、Dr...

Day03 Federated plugins (联合插件)

Federated plugins (联合插件) 是一种将对不同平台的支援功能分为单独的软件包。所以...

Golang快速入门-2(Day5)

那就接续着昨天的内容,今天提到的也是大家常用的function及slice function go在...

安全内容自动化协议(SCAP)

安全内容自动化协议(SCAP)是一种使用特定标准来对组织中部署的系统进行自动化漏洞管理,度量和策略合...