校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Go處理PDF的實現代碼

Go處理PDF的實現代碼

熱門標簽:濮陽自動外呼系統代理 地圖標注測試 福州鐵通自動外呼系統 智能電銷機器人營銷 長沙ai機器人電銷 烏魯木齊人工電銷機器人系統 廣東語音外呼系統供應商 賺地圖標注的錢犯法嗎 澳門防封電銷卡

工作中經常會遇到一些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 name> value>      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中的文本

$ pdftotext input.pdf output.txt

使用unipdf解析pdf中的文本

$ unipdf extract text input.pdf

使用API解析pdf文本,參考unipdf github examples

使用坐標信息解析pdf數據

上面都是先解析出pdf的文本,再根據業務進行處理

還有一種方式是按照坐標位置解析pdf,這種方式更加靈活以及通用,利用的是pdflib/tet

## 輸入一組坐標,即可按照坐標解析pdf中的數據
$ tet --pageopt "includebox={{38 707.93 243.91 716.93}}" input.pdf

坐標可以使用tet對pdf進行分析得到一個tetml文件,里面包含了坐標信息:

$ tet --tetml input.pdf

當然也可以用一些其他的方式獲取pdf中數據的坐標信息,比如nodejs等

注意: pdflib/tet是收費軟件,但是根據官方文檔說明,tet提供基礎功能,處理不超過10頁或者小于1M的pdf文件是不需要購買license的

pdflib/tet提供了命令行工具以及多種語言的sdk支持,比如C/C++/Java/.NET/Perl/PHP/Python/Ruby/Swift 但目前還不支持Go語言,所以對于gopher而言目前只有兩種選擇:CLI OR CGO

八、修復受損PDF文件

有一些pdf文件在電腦上打開時,顯示正常,但是用代碼檢測卻是不正常的,比如在Go中嘗試用一個第三方庫去解析一個(受損的)pdf:

import (
  "fmt"
  "github.com/rsc.io/pdf"
)

func main() {
  filePath := "path/to/your/broken.pdf"
  _, err := pdf.Open(filePath)
  if err != nil {
    fmt.Println("open pdf failed,err:", err.Error())
    return
  }
}

運行后會得到這樣一個結果:

open pdf failed,err: malformed PDF: cross-reference table not found: {5 0 obj}/Contents 6 0 R /Group /CS /DeviceRGB /S /Transparency /Type /Group>> /MediaBox [0 0 595.27600098 841.89001465] /Parent 3 0 R /Type /Page>>

電腦打開正常,程序卻讀取錯誤!

這時候如果嘗試在電腦上打開pdf,然后另存為一個新的pdf文件,再用代碼去檢測,會發現竟然修復了!

太好了,問題解決!

等等,如果我有1000張pdf文件,難道要逐個打開并另存為?這怎么能忍? 所以如果有一種批量修復的功能就好了

在網上找了很久,大概得到三種解決方案:

  • 利用 Acrobat SDK,調用SDK中的另存為功能,可以實現電腦打開另存為的效果
  • 利用ghostscript進行pdf修復
  • 利用mupdf進行pdf修復

這里我只驗證了第三種方式是可行的,這里我使用mupdf-0.9-linux-amd64這個版本進行驗證

下載軟件包后,得到其中一個可執行文件:pdfclean

$ pdfclean broken.pdf repaired.pdf

+ pdf/pdf_xref.c:160: pdf_read_trailer(): cannot recognize xref format: '%'
| pdf/pdf_xref.c:481: pdf_load_xref(): cannot read trailer
\ pdf/pdf_xref.c:537: pdf_open_xref_with_stream(): trying to repair

從輸出結果來看,mupdf嘗試了修復處理

得到新的pdf文件之后,再用前面的Go代碼嘗試打開,就正常了

剩下的就是寫一個bash腳本,批量修復,目標達成!

九、識別一個PDF文件的字體信息

有時候要使多個pdf文本字體保持一致,免不得要去分析pdf中都使用了哪些字體,這時候可以使用xpdf/pdffonts進行字體分析

$ pdffonts input.pdf
name                 type       encoding     emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
NimbusSanL-Regu           CID TrueType   Identity-H    yes no yes   10 0
NimbusSanL-Bold           CID TrueType   Identity-H    yes no yes   20 0

其他Libiray介紹:

PDF-Writer
這是一個C++的開源庫,支持創建pdf,合并pdf,圖片水印文字操作等

對于gopher來講,要使用這個庫,需要封裝一層CGO代碼才可以

rsc/pdf
這是一個Go語言實現的pdf庫,可以用于讀取pdf信息,比如讀取pdf內容/頁數/字體等... 具體可以參考文檔

介紹了這么多第三方庫,簡直就是五花八門,各顯神通。有些功能在大多數庫中都是有重復的,具體使用中會遇到什么問題,還是要看實際情況如何。

希望這些總結能夠對讀者有所幫助

參考:

wkhtmltopdf
xpdf
cpdf
qpdf
unidoc
pdflib/tet
pdfwriter
mupdf
pdfcpu

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Django生成PDF文檔顯示網頁上以及PDF中文顯示亂碼的解決方法
  • Django生成PDF文檔顯示在網頁上以及解決PDF中文顯示亂碼的問題
  • 淺談python實現Google翻譯PDF,解決換行的問題
  • 利用Python的Django框架生成PDF文件的教程

標簽:西雙版納 調研邀請 廣西 德州 阿克蘇 慶陽 貴陽 太原

巨人網絡通訊聲明:本文標題《Go處理PDF的實現代碼》,本文關鍵詞  處理,PDF,的,實現,代碼,處理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go處理PDF的實現代碼》相關的同類信息!
  • 本頁收集關于Go處理PDF的實現代碼的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲免费观看视频| 91久久久免费一区二区| 丰满放荡岳乱妇91ww| 欧美专区在线观看一区| 欧美天堂亚洲电影院在线播放 | 成人午夜在线视频| 91电影在线观看| 国产一区二区三区四区五区入口 | 国产精品国产a级| 欧美日韩视频在线一区二区| 亚洲成人激情自拍| 精品福利二区三区| 一区二区三区在线视频播放| 亚洲精品中文在线观看| 亚洲 欧美综合在线网络| 制服丝袜中文字幕一区| 欧美日韩一卡二卡| 欧美日韩一区二区在线观看 | 欧美tickling网站挠脚心| 激情图片小说一区| 亚洲免费观看在线视频| 午夜精品一区二区三区三上悠亚| 激情综合色综合久久综合| 全国精品久久少妇| 男男gaygay亚洲| 午夜精品成人在线视频| 午夜精品福利一区二区三区蜜桃| 亚洲人吸女人奶水| 秋霞午夜鲁丝一区二区老狼| 久久国产精品99久久久久久老狼| 亚洲成人免费视频| 亚洲一区二区欧美日韩| 日韩一区欧美二区| 亚洲精品国产成人久久av盗摄| 337p日本欧洲亚洲大胆精品 | 一区二区三国产精华液| 免费人成精品欧美精品| 成人av在线网| 欧美精品vⅰdeose4hd| 日韩一区二区三区免费观看| 91在线视频免费91| 久久久久久久一区| 丝袜美腿亚洲一区| 久久久精品天堂| 亚洲一二三四区不卡| 麻豆久久一区二区| 91久久精品一区二区三| 久久亚洲欧美国产精品乐播| 亚洲国产中文字幕| 91久久一区二区| 91精品国产色综合久久不卡蜜臀| 国产精品久久久久三级| 麻豆国产精品视频| 欧美日韩国产成人在线免费| 2024国产精品视频| 18欧美亚洲精品| 不卡视频免费播放| 夜夜精品浪潮av一区二区三区| 成人午夜在线视频| 欧美国产视频在线| 国产在线看一区| 7777精品伊人久久久大香线蕉| 亚洲欧洲日产国码二区| av电影一区二区| 亚洲第一福利一区| 日韩一级大片在线| 精品一区二区三区在线播放视频| 国产精品蜜臀在线观看| 97精品久久久午夜一区二区三区| 国产嫩草影院久久久久| 6080日韩午夜伦伦午夜伦| 国产一区二区三区精品欧美日韩一区二区三区 | 蜜桃av一区二区在线观看| 欧美一区二区福利视频| 久久国产尿小便嘘嘘尿| 中文字幕欧美激情| 欧美成人r级一区二区三区| 国产毛片精品视频| 欧美a级理论片| 日韩午夜激情免费电影| 日韩中文字幕区一区有砖一区 | 丁香天五香天堂综合| wwwwxxxxx欧美| 成人免费毛片片v| 亚洲综合丁香婷婷六月香| 日韩精品一区国产麻豆| 成人av电影免费在线播放| 亚洲成av人片观看| 日韩伦理免费电影| 精品黑人一区二区三区久久| 国产精品成人一区二区三区夜夜夜| 在线精品亚洲一区二区不卡| 9人人澡人人爽人人精品| 成人ar影院免费观看视频| 本田岬高潮一区二区三区| 国产91露脸合集magnet| 99久久精品免费| 色网站国产精品| 欧美性受xxxx黑人xyx性爽| 国内精品伊人久久久久av影院| 欧美剧在线免费观看网站 | 亚洲第一会所有码转帖| 欧美一区二区在线播放| 日韩av在线发布| 亚洲美女屁股眼交| 中文字幕av一区二区三区高| 99久久久免费精品国产一区二区| 欧美成va人片在线观看| 欧美α欧美αv大片| 欧美一区二区三区男人的天堂| 在线免费观看不卡av| 欧美丰满一区二区免费视频| 国产精品久线在线观看| 国内精品视频666| 国产清纯在线一区二区www| 丝袜a∨在线一区二区三区不卡| 91麻豆精品一区二区三区| 日韩av一区二区在线影视| 蜜桃一区二区三区在线观看| 性感美女极品91精品| 国产精品久久久久9999吃药| 99国产欧美久久久精品| 日韩精品一区在线观看| 蜜臀va亚洲va欧美va天堂| 国产午夜精品一区二区三区视频| 国产午夜精品久久久久久久| 亚洲欧美一区二区在线观看| 性久久久久久久| 99re视频这里只有精品| 日韩一区二区三区电影| 亚洲色图欧美在线| 国产老妇另类xxxxx| 欧美另类高清zo欧美| 中文字幕日韩一区二区| 久久国产精品无码网站| 97国产精品videossex| 久久久噜噜噜久久中文字幕色伊伊| 中文字幕av一区二区三区免费看 | 7777女厕盗摄久久久| 精品欧美一区二区久久| 亚洲国产成人porn| 在线观看国产日韩| 亚洲一区二区三区中文字幕 | 日韩欧美高清dvd碟片| 欧美一卡在线观看| 国产日产精品一区| 亚洲bdsm女犯bdsm网站| 免费观看成人鲁鲁鲁鲁鲁视频| 99re在线视频这里只有精品| 欧美激情一区二区三区蜜桃视频| 国产精品国产精品国产专区不蜜| 国产精品视频一二| 久久久99久久| 中文字幕欧美国产| 欧美最新大片在线看| 91精选在线观看| 欧美老肥妇做.爰bbww视频| 精品国产乱码久久久久久夜甘婷婷| 国产精品国产三级国产aⅴ中文| 91蝌蚪porny九色| 久久久精品综合| 精品影视av免费| 丁香六月综合激情| 国产成人在线免费观看| 亚洲国产欧美在线| 丰满岳乱妇一区二区三区| 中文字幕中文字幕在线一区| 欧美日韩国产另类一区| 麻豆视频观看网址久久| 国产精品色婷婷| 精品国产欧美一区二区| 色拍拍在线精品视频8848| 午夜精品久久久久久久蜜桃app| 日韩一区二区三区视频在线观看| 国产一区二区按摩在线观看| 亚洲视频资源在线| 久久众筹精品私拍模特| 在线视频一区二区三| 成人av资源站| 国产一区二区三区在线观看精品| 懂色av中文字幕一区二区三区| 天天av天天翘天天综合网色鬼国产 | 粉嫩av一区二区三区| 奇米精品一区二区三区在线观看| 亚洲九九爱视频| 日韩av电影天堂| 伦理电影国产精品| 国产福利不卡视频| 国产成人免费网站| 久久99国产精品久久99| 91网上在线视频| 午夜精品福利在线| 国产欧美综合在线| 欧美一区三区四区| 在线免费观看日本欧美| 国内精品伊人久久久久av一坑 | 国产精品国产三级国产普通话99| 欧美性欧美巨大黑白大战| 亚洲国产色一区| 色综合一区二区|