2018年2月26日 星期一

Linux(Ubuntu)中pdf的拆解、合併、壓縮

由於看到友人傳來的pdf檔太大,在彼此間共享不方便,於是在網路上搜尋pdf檔案壓縮的方法,將有關pdf的拆解、合併、壓縮整理如下:

一、pdf的拆解
1.(1)使用pdftoppm將pdf拆解為一張張ppmjpeg、png、tiff
   #  pdftoppm [options] [PDF-file] [PPM-file-prefix]
 ※例 pdftoppm a.pdf a (將a.pdf拆為一張張ppm圖檔)
 ※ [options]:-f 起始頁 -l 終止頁 -r (DPI) [png/jpeg/tiff]
     (-r:內定150DPI)
   ※Help:pdftoppm -h

   (2)一次掃2頁的圖,將pdf每頁裁切為2頁(先單頁後雙頁)ppm
    例: pdftoppm -jpeg -x 60 -y 80 -W 640 -H 360 input.pdf output
      (裁切一個寬度為 640 像素、高度為 360 像素的區域,此區域距離左邊界 60 像素、距離上邊界 80 像素)
   例:單頁:pdftoppm -x 200 -y 130 -W 2050 -H 700 abc.pdf up 
       雙頁:pdftoppm -x 230 -y 1550 -W 2050 -H 700 abc.pdf dn

   ★注意:每本書掃描的大小可能不同,需測試(輸出幾頁暫停[Ctrl+C])。
    (安裝xdotool,# xdotool getmouselocation,再求滑鼠座標差,可得到各座標大約數值)

★參考:Linux將PDF轉為圖片檔的指令教學與範例 (說明詳盡)
==============
2.(1)使用 ImageMagick 將 PDF 檔拆解為一張張 JPG 圖片檔
 例:(1)# convert input.pdf output.jpeg (預設72DPI)
      (2)# convert -density 300 input.pdf -quality 90 output.jpg
  (-density=dpi值;-quality=圖片壓縮層級)
 ※輸出其他格式的圖檔,就直接更改輸出檔名的副檔名即可(如png)。

  (2)只抽取部分頁面:頁碼從 0 開始算起
    # convert -density 300 input.pdf[4] -quality 90 output.jpg(只有第5頁)

    # convert -density 300 input.pdf[0-2] -quality 90 output.jpg(只抽取前三頁)
 (3)加上 -trim 讓 ImageMagick 自動把白邊去除
   # convert -density 300 input.pdf -quality 90 -trim output.jpg
(ImageMagick 去除白邊的方法是以最角落的像素顏色為準,凡是跟最角落像素的顏色相同的邊緣就自動去除,如果想要放寬判斷邊緣的標準,可以使用 -fuzz 來指定放寬的門檻值[-fuzz distance{%}]。)
(4)若要將轉出來的圖片進行裁切,可以加上 -extract 參數:
例:# convert -density 300 -extract 960x540+180+220 input.pdf output.jpg
(寬960像素、高540像素的區域;距左邊界180像素、距上邊界220像素)

★參考:Linux將PDF轉為圖片檔的指令教學與範例 (說明詳盡)
★參考:用ImageMagic將PDF轉成高品質圖
==============
3.用pdftocairo將pdf拆解為一張張jpegpng(或壓縮為另一個pdf檔)
   # pdftocairo [options] <PDF-file> [<output-file>]
  ※例:
 (1)pdftocairo -jpeg a-1.pdf a-1 (將a-1.pdf拆為a-1-01.jpg、a-1-02.jpg……)
 (2)pdftocairo -jpeg -f 3 -l 5 a-1.pdf a-1(將a-1.pdf分離出第3頁到第5頁為a-1-03.jpg、a-1-04.jpg、a-1-05.jpg)
※要看參數用法: pdftocairo -h
※拆為jpeg較快,檔案較小;拆為png很慢,檔案很大。
※ [options]=png/jpeg/pdf/ps/eps/svg
※參數 [-r]為解析度,內定為150PPI
參考網站:Ubuntu Manpage: pdftocairo
=============
4.使用 GhostScript 將pdf轉為一張張 jpg或png
  (1)將 PDF 檔轉為 JPG 圖片檔
# gs -dNOPAUSE -dBATCH -sDEVICE=jpeg -r300 -sOutputFile='page-d.jpg' fnli.pdf

  (2)將 PDF 檔轉為支援透明度的 PNG 圖片檔
# gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r300 -sOutputFile='page-d.png' fnli.pdf
★參考:Linux將PDF轉為圖片檔的指令教學與範例 
=============
5.(1)用pdfimages擷取pdf中所含有的圖片(有文字有圖片者可用)
 # pdfimages -all input.pdf output
   (預設也是會將圖片儲存成 ppm,而加上 -all 可以原始格式儲存)
  (2)# pdfimages -list input.pdf
       (僅列出pdf中圖片清單)

  (3)若要讓圖片檔名加上頁碼
    # pdfimages -all -p input.pdf output

★★xxx★★xxx★★xxx
二、pdf的合併:
1.將多頁ppm合併(會壓縮為6/10)為一個pdf

  # convert <ppm-file> <output-file>
  例:convert a-0?.ppm a-1?.ppm a-0.pdf (將a-0及a-1開頭的所有ppm,依檔案名稱順序壓縮、合併成一個pdf檔)
【註】合併前若要改檔名以符合順序:
批次改檔名:
  # rename  s/檔名的原始字串/新的檔案字串/  要變更的檔案類型
例:
(1)把所有檔案名稱中有 xyz 的部份都改成 aaa
   # rename -v s/xyz/aaa/ *
(加上 -n 先預覽執行結果,確定後再執行;加上 -v 是把檔案都列出來;加上 -w 來覆寫現有檔案)
(2)更換副檔名:
  例:把 .html 置換成 .txt,其它不變。
  # rename -v s/\.html$/\.txt/ *html
 參考:Ubuntu用指令大量更改檔案名稱
==============
2.若不壓縮,將兩個以上pdf合併成一個pdf
 (1)安裝pdftk: # sudo aptitude install pdftk
 (2)pdftk <1.pdf> <2.pdf>……cat output <output-file>
 (3)例:
  ㊀pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf (1、2、3三個pdf合成一個pdf)
  ㊁pdftk *.pdf cat output all.pdf (目錄內所有pdf合成一個pdf)
==============
3.將一個pdf中的某幾頁分離出來合併成一個pdf
   # pdftk A=a.pdf cat A3-5 output dd.pdf (將a.pdf中取第3到5頁合成一個dd.pdf) 

  #例:pdftk A=a-all.pdf cat A1-5 output 0105.pdf (將a-all.pdf中取第1到5頁合成一個0105.pdf)
==============
4.在不同pdf檔中取出各頁合併成一個pdf
   # pdftk A=a0.pdf B=a1.pdf cat A1-2 B1-3 A8 output ABC.pdf (在a0中取1~2頁,在a1中取1~3頁,在a0中取第8頁;將以上各頁依序合併成ABC.pdf)
★★xxx★★xxx★★xxx
三、pdf的壓縮+合併

1.用Ghostscript(若出現未安裝,可到synaptic安裝)
   # gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf


※-dPDFSETTINGS 變數有四種:(原始檔105.4Mb)
(1)/screen (檔案最小(6.3Mb)[和/ebook同][72dpi],壓縮時間長,最不清楚)

(2)/ebook (檔案最小(6.3Mb)[和/screen同],壓縮時間長,最不清楚)
(3)/printer (檔案第二大(10.2Mb),壓縮時間最短,第二清楚) --首選
(4)/prepress  (默認;檔案最大(18.1Mb),壓縮時間第二長,最清楚)

※若不用[-dPDFSETTINGS]參數,可用以下代替:(自行測試)
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \
 ※※※※※※
★例:若要將多個pdf壓縮並合併為一個pdf檔,則可如下:
 # gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=a-012T.pdf a-0.pdf a-1.pdf a-2.pdf  (將a-0、a-1、a-2pdf檔壓縮並合併為較小檔案a-012T.pdf)
=============
 2.將多頁ppm壓縮(6/10))並合併為一個pdf
  # convert <ppm-file> <output-file>
  ※例:convert a-0*.ppm a-1*.ppm a-0.pdf (將a-0及a-1開頭的所有ppm,依檔案名稱順序壓縮、合併成一個pdf檔)
=============
3.將pdf壓縮為另一個pdf
   # pdftocairo -pdf <PDF-file> [<output-file>]

參考:linux-優化pdf
參考資訊:Linux下pdf的編輯

2018年2月1日 星期四

不用辨識軟體--超大文字掃描圖形檔(pdf)中文辨識(OCR)攻略--pdf大檔的拆解、合併及壓縮

  曾經寫過〔辨識--好用的手機APP Google Translate;及網頁Google文件〕這篇文章介紹一點辨識的方法。但若pdf的檔案太大就不能傳到google硬碟辨識了(轉換 Google 文件,大小上限則是 50 MB。)。
  今天接到幾百Mb(有的有1Gb)的檔案,當然是不行囉!
  先是用手機拍照→google翻譯的辨識方法,但有些操作不便(要換頁、拍照、辨識後轉貼寄出),而且速度又慢,於是想辦法解決它。最後終於找到了解決的方法☺


1.安裝imagemagick:
  #sudo apt-get install imagemagick
2.將圖形pdf轉ppm
  #pdftoppm a.pdf a (將a.pdf拆為一張張ppm圖檔)
3.將多頁ppm轉pdf
  #convert a-0?.ppm a-1?.ppm a-0.pdf (將a-0及a-1開頭的所有ppm,依檔案名稱順序合併成一個pdf檔)
4.將大pdf檔壓縮為小檔案(安裝Ghostscript)
  # gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=a-0T.pdf a-0.pdf (將a-0.pdf檔壓縮為較小檔案a-0T.pdf)

5.將轉好的pdf檔傳到Google硬碟。
6.傳上去後,按右鍵,選擇使用google文件開啟,等一下了就幫你辨識好了。
7.按[Ctrl+A]全選,複製貼到文字檔,OK
======
附註1:若是pdf本來就是文字格式轉成的,那麼直接轉換即可
  #pdftotext a.pdf a.txt
======
附註2:網路上有人介安裝tesseract辨識軟體,經測試結果,英文沒問題,中文則不管橫式或直式都不行(橫式中文效果稍好,但還是不行),方法如下:
1.安裝:
  #sudo apt-get install gocr
  #sudo apt-get install tesseract-ocr
  #sudo apt-get install libtiff-tools
2.安裝tesseract-ocr後,到synaptic安裝語言包
(或到官網上下載中文語言包,比如繁體的就是chi_tra(簡體chi_sim),然後加入到一個環境變量中
  #sudo mv chi_tra.traineddata /usr/local/share/tessdata
  #export TESSDATA_PREFIX=/usr/local/share/
3.執行辨識
  #tesseract a1.ppm a1.txt -l chi_tra
(若發生錯誤訊息,則登出再登入,即可執行)