熬了 2 小时,别人不能转的 PDF 我也能转了!

39 天前
 hfxsm

引言

前不久上线的网站www.pdf2docx.cn,有些 pdf 转 word 的时候,存在有些文件存在转换不了的情况,经过查找资料,发现 pdf 还有一些安全属性,导致没有权限去紧张转换 好家伙,竟然被不允许了,那就找工具修改属性!!! 经过调查,发现qpdf 工具挺好使的,可以很方便解除 PDF 文件的安全属性,比如编辑、打印或页面提取的限制。后台是用 golang 实现的,在 Golang 中调用开源的 qpdf 工具,我们可以轻松完成这一任务。本文将分享如何在 Golang 程序中集成 QPDF ,以及如何处理解除 PDF 限制过程中常见的错误。

环境设置

安装 QPDF

首先,您需要确保系统上安装了 QPDF 。如果还没有安装,请按照以下步骤安装:

代码实现

在 Golang 中调用 QPDF ,可以使用 os/exec 包中的 exec.Command 函数:

package main

import (
	"fmt"
	"os/exec"
)

// RemovePDFRestrictions 使用 qpdf 移除 PDF 文件的限制。
func RemovePDFRestrictions(inputFile, outputFile string) error {
	// 这里我把 qpdf.exe 放在了本程序的同意目录下。
	cmd := exec.Command("./qpdf.exe", "--decrypt", inputFile, outputFile)

	// 获取 QPDF 执行结果
	output, err := cmd.CombinedOutput()
	outputStr := string(output)

	// 打印完整的 QPDF 命令输出,以便调试
	fmt.Println("QPDF Output:", outputStr)

	if err != nil {
		exitError, ok := err.(*exec.ExitError)
		if ok {
			// 检查退出状态
			if exitError.ExitCode() == 3 {
				// 退出状态 3 通常意味着警告
				fmt.Println("QPDF completed with warnings.")
				return nil // 忽略这些警告
			}
		}
		return fmt.Errorf("qpdf failed with %s: %s", err, outputStr)
	}

	return nil
}

func main() {
	// 调用函数解除 PDF 限制
	err := RemovePDFRestrictions("source.pdf", "unrestricted.pdf")
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("PDF restrictions removed successfully.")
	}
}

错误处理

上面的代码提供了完整的错误处理逻辑:

总结

至此,对于被安全属性锁定的 pdf ,就拥有了页面提取权限,可以进行转换了,快来体验下吧,效果杠杠滴。www.pdf2docx.cn

2624 次点击
所在节点    分享创造
3 条回复
romotc
38 天前
wps 、word 、execl 转 Pdf 的 API 现在收费吗?
API 文档页面文字变灰色了,看不清
hfxsm
38 天前
@romotc API 很便宜的。文档最后加个微信可以单独发一份文档哈。
lozzow
38 天前
我想问下做这种纯工具网站能把服务器的钱赚回来吗?没看到网站上的收费项目和广告

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1040100

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX