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