Re: [心得] 裁切 pdf 的頁面(添加巨集功能)

作者: bleph (bleph)   2015-03-10 08:22:18
有時候由於 pdf 版本過新, 使得 LaTeX 在編輯時的動作很耗時間
可能轉回圖片檔去做會比較好.
對於 pdf 轉圖片檔的工具, 個人推薦 ImageMagick,
(要先安裝 ghostscript 才行)
它的 convert 指令威力強大
針對一個 pdf 檔, 如果要全檔轉為 jpg 檔,
可以下的指令是:
convert -density 300 example.pdf example.jpg
density 指的是解析度, 單位為 dpi (dots per inch)
可依個人需要設得更高或較低
如果有時 pdf 檔頁數太多或太大
那在 windows 下可以考慮製作一個 bat 檔, 一頁一頁轉換
Ex:
convert -density 300 example.pdf[10] 0010.jpg
[] 內指的是頁數
轉換好了之後, 如果想應用類似的巨集, 一樣可以使用
不過圖片檔的單位多是 point, 所以需要一個看圖軟體
個人推薦 XnView, 它是 freeware, 私人使用免費
請參考 http://www.xnview.com/
用 XnView 來開啓您的圖片檔,
在最左下角的資訊列會顯示圖片資訊, 例如
2461x3236x24 指的是一張大小為 2461 x 3236 的圖片
游標在圖片上移動, 也會顯示對應游標的 x,y 座標
圖片的資訊可以由 Edit(編輯) -> Properties 進入, 或按
快速鍵 Alt+Enter ; 可以看到此張圖片的 pixel per inch 的資訊
================== 我是分隔線 =================
如果要像前文一樣使用 LaTeX 的巨集,
筆者新加入了 \myincludejpggraphics 的功能,
方法類似 \myincludepdfgraphics
例如:
\myincludejpggraphics{scewidth=2362,sceheight=3260, %
resolution=300, source=0014.jpg, %
lt=1208,up=2260, %
rt=2300,dn=3093,newwidth=5}
scewidth 指的是圖片寛度, 以 point 為單位,
sceheight 指的是圖片高度
resolution 指的是幾 dpi 的意思, 未輸入會以 300 為預設值
(lt,up): 請把游標移到圖片左上角, 此時的 (x,y) 即對應的 (lt,up)
(rt,dn) 指的是圖片右下角
newwidth 的單位是公分, 若未輸入巨集會自行計算
============== 我是分隔線 =================
為了方便起見, 請將以下文字存成一個 tex 檔案,
與您要編輯的檔案放在同一個資料夾
在 preamble 處使用
\input{檔名.tex}
來引用即可
============== 我是分隔線 =================
\usepackage{fp}
\usepackage{xkeyval}
\usepackage{adjustbox}
\usepackage{ifthen}
%先對 pdf 紙張大小設定預設值為 A4 paper
\def\sourcepdfwidth{21.0}
\def\sourcepdfheight{29.7}
\makeatletter %開始
\define@key{pdfmanage}{lt}{\def\myleftmargin{#1}} %左邊界,也是左側應裁切的量
\define@key{pdfmanage}{rt}{\def\myrightmargin{#1}} %右邊界
\define@key{pdfmanage}{up}{\def\myuppermargin{#1}} %上方邊界, 也是應裁的量
\define@key{pdfmanage}{dn}{\def\mydownmargin{#1}} %下方邊界
\define@key{pdfmanage}{angle}{\def\myangle{#1}} %旋轉角度
\define@key{pdfmanage}{page}{\def\mypage{#1}} %頁數
\define@key{pdfmanage}{newwidth}{\def\mynewwidth{#1}} %裁割後的圖片新的寬度
\define@key{pdfmanage}{scewidth}{\def\mysourcewidth{#1}} %pdf 頁面寬度
\define@key{pdfmanage}{sceheight}{\def\mysourceheight{#1}} %pdf 頁面高度
\define@key{pdfmanage}{source}{\def\mysourcefilename{#1}} %pdf 檔名
%底下提供預設值
\presetkeys{pdfmanage}{lt=0,rt=0,up=0,dn=0,angle=0,page=1,newwidth=-10, %
scewidth=\sourcepdfwidth,sceheight=\sourcepdfheight}{}
% 這邊若使用者未輸入圖片裁切後新的寬度, 則預設為 -10, 後面會重新計算
\newcommand{\getsourcepdfparameter}[1]{
\setkeys{pdfmanage}{#1}
}
\makeatother %結束
\newcommand{\myincludepdfgraphics}[1]{
\getsourcepdfparameter{#1}
%底下使用 fp 套件計算右邊界及下方邊界應裁的量
\FPeval\truerightmargin{\mysourcewidth-\myrightmargin}
\FPeval\truedownmargin{\mysourceheight-\mydownmargin}
% ifthen套件的作用在此
% 如使用者未輸入新的圖片寬度,則預設為 -10, 我們
% 再用右邊界減去左邊界,以之作為圖片寬度(即圖片寬度不變)
% 這樣又可以少計算一項數據
\ifthenelse{\equal{\mynewwidth}{-10}}
{\FPeval\mynewwidth{\myrightmargin-\myleftmargin}{}}
\resizebox{\mynewwidth cm}{!}{ %請注意 \mynewwidth 與其後的"公分"
%有一空白鍵隔開
\adjustbox{trim=\myleftmargin cm \truedownmargin cm \truerightmargin cm
\myuppermargin cm,clip}{%
\includegraphics[angle=\myangle,page=\mypage]{\mysourcefilename}}}
}
%================================================================
%以下要開始用新的巨集, jpg檔 以 pt 為單位
%================================================================
\def\sourcejpgwidth{2480.3} %21.0*300/2.54=2480.3
\def\sourcejpgheight{3507.87} %29.7*300/2.54=3507.87
\makeatletter %開始
\define@key{jpgmanage}{lt}{\def\myjpgleftmargin{#1}}
%左邊界,也是左側應裁切的量, pt
\define@key{jpgmanage}{rt}{\def\myjpgrightmargin{#1}} %右邊界,pt
\define@key{jpgmanage}{up}{\def\myjpguppermargin{#1}}
%上方邊界, 也是應裁的量,pt
\define@key{jpgmanage}{dn}{\def\myjpgdownmargin{#1}} %下方邊界,pt
\define@key{jpgmanage}{angle}{\def\myjpgangle{#1}} %旋轉角度
\define@key{jpgmanage}{page}{\def\myjpgpage{#1}} %頁數
\define@key{jpgmanage}{newwidth}{\def\myjpgnewwidthcm{#1}}
%裁割後的圖片新的寬度, 以公分為單位
\define@key{jpgmanage}{scewidth}{\def\myjpgsourcewidth{#1}} %jpg 頁面寬度,pt
\define@key{jpgmanage}{sceheight}{\def\myjpgsourceheight{#1}} %jpg 頁面高度,pt
\define@key{jpgmanage}{source}{\def\myjpgsourcefilename{#1}} %jpg 檔名
\define@key{jpgmanage}{resolution}{\def\myjpgresolution{#1}}
%jpg 檔的解析度, dpi (dots per inch)
%底下提供預設值
\presetkeys{jpgmanage}{lt=0,rt=0,up=0,dn=0,angle=0,page=1,newwidth=-10, %
scewidth=\sourcejpgwidth,sceheight=\sourcejpgheight,resolution=300}{}
% 這邊若使用者未輸入圖片裁切後新的寬度, 則預設為 -10, 後面會重新計算
\newcommand{\getsourcejpgparameter}[1]{
\setkeys{jpgmanage}{#1}
}
\makeatother %結束
\newcommand{\myincludejpggraphics}[1]{
\getsourcejpgparameter{#1}
%底下使用 fp 套件計算右邊界及下方邊界應裁的量
\FPeval\truejpgrightmargincm{(\myjpgsourcewidth-\myjpgrightmargin)/ %
\myjpgresolution
* 2.54}
\FPeval\truejpgdownmargincm{(\myjpgsourceheight-\myjpgdownmargin)/ %
\myjpgresolution
* 2.54}
%使用 fp 套件將 dpi 轉換為公分單位
\FPeval\truejpgleftmargincm{\myjpgleftmargin/\myjpgresolution * 2.54}
\FPeval\truejpgupmargincm{\myjpguppermargin/\myjpgresolution * 2.54}
% ifthen套件的作用在此
% 如使用者未輸入新的圖片寬度,則預設為 -10, 我們
% 再用右邊界減去左邊界,以之作為圖片寬度(即圖片寬度不變)
% 這樣又可以少計算一項數據
\ifthenelse{\equal{\myjpgnewwidthcm}{-10}}
{\FPeval\myjpgnewwidthcm{(\myjpgrightmargin-\myjpgleftmargin)/ %
\myjpgresolution * 2.54}{}}
\resizebox{\myjpgnewwidthcm cm}{!}{ %請注意 \mynewwidth 與其後的"公分"
%有一空白鍵隔開
\adjustbox{trim=\truejpgleftmargincm cm \truejpgdownmargincm cm
\truejpgrightmargincm cm
\truejpgupmargincm cm,clip}{%
\includegraphics[angle=\myjpgangle,page=\myjpgpage]{\myjpgsourcefilename}}}
}
%測試範例 1 (pdf 檔)
% \myincludepdfgraphics{page=5,scewidth=21,sceheight=27.94,source=exam.pdf, %
% lt=1.7,rt=11.6,up=2.3,dn=11.5,newwidth=10} % 試著不 key 入新圖片寬度
%測試範例 2 , 也可以使用 figure 環境
%\begin{figure}
%\myincludepdfgraphics{page=3,scewidth=21,sceheight=27.94,source=exam.pdf, %
% lt=1.4,dn=14.4,up=2.3,rt=7.1,newwidth=3.5}
%\caption{第二張圖} \label{fig2}
%\end{figure}
%測試範例3 (圖片檔)
% \myincludejpggraphics{scewidth=2362,sceheight=3260,source=example.jpg, %
% lt=1208,up=2260,rt=2300,dn=3093,newwidth=5}
% scewidth, sceheight, lt,up,rt,dn 皆以 point 為單位,
% 預設 resolution=300(dpi)
% newwidth 要以公分輸入

Links booklink

Contact Us: admin [ a t ] ucptt.com