您现在的位置是:网站首页> 编程资料编程资料

Go处理PDF的实现代码_Golang_

2023-05-26 408人已围观

简介 Go处理PDF的实现代码_Golang_

工作中经常会遇到一些pdf文件处理的问题,一千种pdf有一千种处理方式,每次都是绞尽脑汁和这些pdf战斗到底。

本人又是一个gopher,所以这篇文章会以一个goper的视角,列举一下我所经历过的每一种pdf处理场景,比如:

pdf渲染
pdf校验
pdf加水印
pdf获取页数
pdf合并
pdf拆分
修复受损pdf
pdf转png
识别pdf中的字体
pdf解密
...

本文大多是场景问题的罗列,可以根据标题摘取自己有兴趣的部分查看

很多pdf的问题我也不是特别专业,如果问题或者疑问欢迎与我交流

一、HTML页面渲染PDF

根据html页面渲染pdf,我使用过以下两种方案:

  • wkhtmltopdf
  • chromedp

1. 使用wkhtmltopdf渲染pdf

wkhtmltopdf是一个命令行工具,用于将HTML页面渲染为PDF,基于Qt WebKit渲染引擎实现

使用方式比较简单:

 ## 将一个静态html页面打印成pdf $ wkhtmltopdf input.html output.pdf ## 将一个网页打印成pdf $ wkhtmltopdf https://www.google.com output.pdf 

wkhtmltopdf的参数很丰富,比如:

支持发送 http post请求,适合将自定义开发的网页渲染成pdf文件:

 $ wkhtmltopdf --help ... --post  Add an additional post field (repeatable) ... 

支持javascript脚本,在渲染pdf前对html进行修改:

 $ wkhtmltopdf --run-script "javascript:(function(){document.getElementsByClassName('dom_class_name')[0].style.display = 'none'}())" page input.html output.pdf 

更多详细参数可看官网文档

如果你使用Go语言,还有一个第三方包,是对wkhtmltopdf的使用封装:go-wkhtmltopdf

2. 使用chromedp渲染pdf

chromedp是一种在Go语言中以更快,更简单的方式来驱动支持Chrome DevTools协议的浏览器的软件包,而无需外部依赖((例如Selenium或PhantomJS).

使用方式:

 package main import ( "context" "io/ioutil" "github.com/chromedp/cdproto/page" "github.com/chromedp/chromedp" "errors" ) func main(){ err := ChromedpPrintPdf("https://www.google.com", "/path/to/file.pdf") if err != nil { fmt.Println(err) return } } func ChromedpPrintPdf(url string, to string) error { ctx, cancel := chromedp.NewContext(context.Background()) defer cancel() var buf []byte err := chromedp.Run(ctx, chromedp.Tasks{ chromedp.Navigate(url), chromedp.WaitReady("body"), chromedp.ActionFunc(func(ctx context.Context) error { var err error buf, _, err = page.PrintToPDF(). Do(ctx) return err }), }) if err != nil { return fmt.Errorf("chromedp Run failed,err:%+v", err) } if err := ioutil.WriteFile(to, buf, 0644); err != nil { return fmt.Errorf("write to file failed,err:%+v", err) } return nil } 

二、PDF加水印

我了解到的支持pdf加水印的工具有:

  • unidoc/unipdf
  • pdfcpu

1.unidoc/unipdf

unidoc平台开发的unipdf是一款用Go语言编写的PDF库,提供API和CLI使用模式,支持以下功能:

 $ unipdf -h ... Available Commands: decrypt Decrypt PDF files encrypt Encrypt PDF files explode Explodes the input file into separate single page PDF files extract Extract PDF resources form PDF form operations grayscale Convert PDF to grayscale help Help about any command info Output PDF information merge Merge PDF files optimize Optimize PDF files passwd Change PDF passwords rotate Rotate PDF file pages search Search text in PDF files split Split PDF files version Output version information and exit watermark Add watermark to PDF files ... 

CLI模式添加水印

 $ unipdf watermark in.pdf watermark.png -o out.pdf Watermark successfully applied to in.pdf Output file saved to out.pdf 

使用API添加水印,可以直接参考unipdf github example

注意:unidoc的产品需要付费购买license使用

2.pdfcpu

pdfcpu 是一个用Go语言编写的PDF处理库,提供API和CLI模式使用

支持以下功能:

 $ pdfcpu help ... The commands are: attachments list, add, remove, extract embedded file attachments changeopw change owner password changeupw change user password decrypt remove password protection encrypt set password protection extract extract images, fonts, content, pages, metadata fonts install, list supported fonts grid rearrange pages or images for enhanced browsing experience import import/convert images to PDF info print file info merge concatenate 2 or more PDFs nup rearrange pages or images for reduced number of pages optimize optimize PDF by getting rid of redundant page resources pages insert, remove selected pages paper print list of supported paper sizes permissions list, set user access permissions rotate rotate pages split split multi-page PDF into several PDFs according to split span stamp add, remove, update text, image or PDF stamps for selected pages trim create trimmed version of selected pages validate validate PDF against PDF 32000-1:2008 (PDF 1.7) version print version watermark add, remove, update text, image or PDF watermarks for selected pages ... 

使用CLI工具以图片形式添加水印:

 $ pdfcpu watermark add -mode image 'voucher_watermark.png' 's:1 abs, rot:0' in.pdf out.pdf 

调用api添加水印

 package main import ( "github.com/pdfcpu/pdfcpu/pkg/api" "github.com/pdfcpu/pdfcpu/pkg/pdfcpu" ) func main() { onTop := false wm, _ := pdfcpu.ParseImageWatermarkDetails("watermark.png", "s:1 abs, rot:0", onTop) api.AddWatermarksFile("in.pdf", "out.pdf", nil, wm, nil) } 

三、PDF合并

  • cpdf
  • unipdfc
  • pdfcpu

1.使用cpdf合并pdf

cpdf是一个开源免费的PDF命令行工具库,有丰富的功能,比如:

  • Merge PDF files together, or split them apart
  • Encrypt and decrypt
  • Scale, crop and rotate pages
  • Read and set document info and metadata
  • Copy, add or remove bookmarks
  • Stamp logos, text, dates, page numbers
  • Add or remove attachments
  • Losslessly compress PDF files

合并pdf:

 $ cpdf -merge input1.pdf input2.pdf -o output.pdf

2.使用unipdf合并pdf

 $ unipdf merge output.pdf input1.pdf input2.pdf 

使用API合并pdf,参考unpdf github example

3.使用pdfcpu合并pdf

 $ pdfcpu merge output.pdf input1.pdf input2.pdf 

注意: pdfcpu只支持版本低于PDF V1.7的pdf文件

四、拆分PDF

  • cpdf
  • unipdf
  • pdfcpu

1.使用cpdf拆分pdf

 ## 逐页拆分成单个pdf $ cpdf -split in.pdf 1 even -chunk 1 -o ./out%%%.pdf

2. 使用unipdf拆分pdf

 ## 将第一页拆分出来 $ unipdf split input.pdf out.pdf 1-1 

使用api拆分pdf,参考unipdf github examples

3.使用pdfcpu拆分pdf

 $ pdfcpu split in.pdf . 

五、PDF转图片

  • mupdf
  • xpdf

1. 使用mupdf操作pdf转图片

MuPDF is a lightweight PDF, XPS, and E-book viewer.
MuPDF consists of a software library, command line tools, and viewers for various platforms.

下载mupdf后得到一些工具,比如:

mupdf              
pdfdraw
pdfinfo            
pdfclean           
pdfextract         
pdfshow            
xpsdraw

其中pdfdraw可用来转换图片

 $ pdfdraw -o out%d.png in.pdf 

注意: mupdf不支持mac OS

2. 使用xpdf操作pdf转图片

xpdf是一个免费的PDF工具包,包括文字解析,图片转换,html转换等

下载该软件包后,可以得到一系列的工具:

pdfdetach
pdffonts 
pdfimages
pdfinfo  
pdftohtml
pdftopng 
pdftoppm 
pdftops  
pdftotext

从名称上看,大致能看出来每一个工具的用处

 ## 使用pdftopng将pdf转换成png $ pdftopng in.pdf out-prefix

六、PDF解密

经常会遇到一种场景,读取pdf文件的时候发现会报错:文件被加密

但是在没有密码的情况下怎么解决呢?

  • 使用qpdf解密

使用qpdf进行强制解密,有些情况是可以解密成功的,但是有些情况也不一定能解密成功

qpdf是一个支持命令行的pdf工具

 $ qpdf --decrypt in.pdf out.pdf

使用pdfcpu解密

 $ pdfcpu decrypt encrypted.pdf output.pdf 

当有密码的情况下,可以使用密码解密:

使用unipdf解密pdf

 $ unipdf decrypt -p pass -o output.pdf input.pdf 

七、PDF识别

经常会遇到一些场景,比如识别一个文件是不是pdf文件,识别pdf中的文字,识别pdf中的图片等

1.识别pdf中的文字

这里使用xpdf将pdf中的文字解析出来,然后再使用一些字符串操作或者正则表达式进行业务分析

使用xpdf/pdftotext解析pdf中的文本

提示:
                    本文由整理自网络,如有侵权请联系本站删除!
                    
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!

-六神源码网