1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
# pdfcrop
Version: 2023/04/15 v1.42
## TABLE OF CONTENTS
1. Description
2. Copyright, Disclaimer, License
3. Files
4. Requirements
5. Installation
6. User Interface
7. Restricted Mode
8. Author
9. Acknowledgement
9. Questions, Suggested Improvements
9. Known Problems
9. History
9. ToDo
## 1\. DESCRIPTION
PDFCROP takes a PDF file as input, calculates the BoundingBox
for each page by the help of ghostscript and generates a output
PDF file with removed margins.
## 2\. COPYRIGHT, DISCLAIMER, LICENSE
Copyright (C) 2002, 2004, 2005, 2008-2012 Heiko Oberdiek.
2020-2023 Oberdiek Package Support Group
LaTeX Project Public License, version 1.3c or later.
## 3\. FILES
The project `pdfcrop` consists of two files:
`pdfcrop.pl`: This perl script is the main program. The extension
`.pl` may be omitted.\
`README.md`: Documentation, the file you are reading.
Following temporary files are produced if `pdfcrop` is invoked:
`tmp-pdfcrop-*.tex`: input file for pdfTeX, luatex or xetex\
`tmp-pdfcrop-*.log`: log file of pdfTeX, luatex or xetex run\
`tmp-pdfcrop-*.pdf`: result after pdfTeX, luatex or xetex run
The temporary files are deleted after the run unless the `--debug` option is
used.
## 4\. REQUIREMENTS
* Perl5 (version 5 of the perl interpreter)
* Ghostscript (>= 8.0 if PDF file contains rotated pages)
* pdfTeX, version >= 1.0 (because of page selecting and \pdfximage syntax)
or XeTeX or LuaTeX.
## 5\. INSTALLATION
Normally `pdfcrop` will be installed by the TeX system.
If a manual installation is needed
### 1\. Perl script `pdfcrop.pl`:
TDS 1.1 location (TDS means "texmf" tree, see CTAN:tds/tds.pdf):
* TDS:scripts/pdfcrop/pdfcrop.pl
* and a directory that is part of PATH contains a wrapper script
or link with name "pdfcrop".
Unix
* It is allowed to rename `pdfcrop.pl` to `pdfcrop`:
mv pdfcrop.pl pdfcrop
* Ensure that the execute permission is set:
chmod +x pdfcrop
* Move the file to a directory where the shell can find it
(environment variable PATH, e.g. /usr/local/bin/).
Dos/Windows
* See requirements. I do not expect that the perl script
runs under DOS.
### 2\. Restricted program version `rpdfcrop`
Generate links or install `pdfcrop.pl` again under the
name `rpdfcrop`.
Prefer `rpdfcrop` if you want to add pdfcrop to the
programs that may be executed in TeX's restricted
shell escape mode. (This feature is added in TeX Live 2009.)
For TeX Live (since 2009) see entry for `shell_escape_commands`
in the configuration file `texmf.cnf`.
### 3\. Documentation `README.md`:
Copy it to an appropriate place, for example
`/usr/local/share/doc/pdfcrop/README.md`.
It is allowed to rename it to `pdfcrop.txt` or `pdfcrop.md`.
TDS location:\
somewhere below texmf/doc/... (?)
Examples:\
`TDS:doc/support/pdfcrop/README.md`\
`TDS:doc/scripts/pdfcrop/README.md`\
`TDS:doc/scripts/pdfcrop.txt`
TeXLive 2020 put it in\
`TDS:doc/support/pdfcrop/README.md`
## 6\. USER INTERFACE
* ToDo: User manual
* Online help:
`pdfcrop --help`
* Ghostscript's calculation of the bounding box is faster,
if `--resolution 72` is used instead of ghostscript's implicite
default setting of 4000 DPI (hint from Ionut Georgescu).
Of course the calculation with higher resolution settings are
more accurate.
## 7\. RESTRICTED MODE
Restricted mode is enabled if:
* option `--restricted` is used,
* the program is called under the name `rpdfcrop`
* or the called program name contains `restricted`.
This mode sets restrictions for the following options:
* `--pdftexcmd`: if used, the value must be empty or `pdftex`.
* `--xetexcmd`: if used, the value must be empty or `xetex`.
* `--luatexcmd`: if used, the value must be empty or `luatex`.
* `--gscmd`: if used, the value must
* be empty or
* be one of the standard names (gs, gswin32c, gswin64c, mgs, gs386, gsos2) or
* consists of `gs`, followed by a version number and an
optional `c` (Ghostscript's convention for `console version`).
## 8\. AUTHORS
Heiko Oberdiek\
Email: heiko.oberdiek at googlemail.com\
Oberdiek Package Support Group\
[https://github.com/ho-tex/pdfcrop]
## 9\. ACKNOWLEDGEMENT
Anthony Williams\
Scott Pakin <pakin at uiuc.edu>\
Ionut Georgescu\
Yves Jäger\
R (Chandra) Chandrasekhar\
Christian Stapfer\
David Menestrina\
Karl Berry
## 10. QUESTIONS, SUGGESTED IMPROVEMENTS
If you have questions, problems with `pdfcrop`, error reports,
if you have improvements or want to have additional features,
please send them to the author or add an issue to
https://github.com/ho-tex/pdfcrop
My environment for developing and testing:
* linux, SuSE 9.0
* perl v5.8.1
* pdfTeX 3.141592-1.40.x
* Ghostscript 8.x
## 11. KNOWN PROBLEMS
* pdfcrop relies on Ghostscript for the calculation of the
Bounding Box. If Ghostscript returns wrong values or
cannot process the pdf file, it sometimes helps to try
another version of Ghostscript.
* Older XeTeX (and pdfTeX < 1.10a) does not allow the setting of the
PDF version in a direct way. In this cases pdfcrop tries to fix the PDF version
afterwards in the PDF header and XeTeX warnings as the following can be safely ignored.
** WARNING ** Version of PDF file (1.6) is newer
than version limit specification.
## 12. HISTORY
|Version | Notes |
|----------------|-------|
|2002/10/30 v1.0:| First release|
|2002/10/30 v1.1:| Option `--hires` added.|
|2002/11/04 v1.2:| "nul" instead of "/dev/null" for windows.|
|2002/11/23 v1.3:| Use of File::Spec module's "devnull" call.|
|2002/11/29 v1.4:| Option `--papersize` added.|
|2004/06/24 v1.5:| Clear map file entries so that pdfTeX does not touch the fonts.|
|2004/06/26 v1.6:| Use mgs.exe instead of gswin32c.exe for MIKTEX.|
|2005/03/11 v1.7:| Support of spaces in file names |
|-- | `(open("-`|`")` is used for ghostscript call).|
|2008/01/09 v1.8:| Fix for moving the temporary file to the output file across file system boundaries.|
|2008/04/05 v1.9:| Options `--resolution` and `--bbox` added. |
|2008/07/16 v1.10:| Support for XeTeX added with new options `--pdftex`, `--xetex`, `--xetexcmds`.|
|2008/07/22 v1.11:| Workaround for `(open("-`|`")`.|
|2008/07/23 v1.12:| Workarounds for the workaround (error detection, ...).|
|2008/07/24 v1.13:| `(open("-`|`")`/ workaround removed.|
|-- | Input files with unsafe file names are linked/copied to temporary file with safe file name.|
|2008/09/12 v1.14:| Error detection for invalid Bounding Boxes.|
|2009/07/14 v1.15:| Fix for negative coordinates in Bounding Boxes (David Menestrina).
|2009/07/17 v1.16:| Security fixes: |
|-- | \* `-dSAFER` added for Ghostscript, |
|-- | \* `-no-shell-escape` added for pdfTeX/XeTeX.|
|2009/07/17 v1.17:| Security fixes:
|-- | \* Backticks and whitespace are forbidden for options `--gs`, `--pdftexcmd`, `--xetexcmd`.|
|-- | \* Validation of options `--papersize` and `--resolution`.|
|2009/07/18 v1.18:| \* Restricted mode added. |
|-- | \* Option `--version` added.|
|2009/09/24 v1.19:| \* Ghostscript detection rewritten. |
|-- | \* Cygwin: `gs` is preferred to `gswin32c`.|
|2009/10/06 v1.20:| \* File name sanitizing in .tex file.|
|2009/12/21 v1.21:| \* Option `--ini` added for iniTeX mode. |
|-- | \* Option `--luatex` and `--luatexcmd` added for LuaTeX.|
|2009/12/29 v1.22:| \* Syntax description for option `--bbox` fixed (Lukas Prochazka).|
|2010/01/09 v1.23:| \* Options `--bbox`-odd and --bbox-even added.|
|2010/08/16 v1.24:| \* Workaround added for buggy ghostscript ports that print the BoundingBox data twice.|
|2010/08/26 v1.25:| \* Fix for the case that the PDF file contains an entry /CropBox different to /MediaBox.|
|-- | \* \pageinclude implemented for XeTeX. |
|-- | \* XeTeX: `--clip` does not die, but this option is ignored, because XeTeX always clip.|
|2010/08/26 v1.26:| \* XeTeX's \XeTeXpdffile expects keyword `media`, not `mediabox`.|
|-- | \* New option `--pdfversion`.|
|-- | Default is `auto` that means the PDF version is inherited from the input file. Before pdfcrop has used the TeX engine's default.|
|-- | \* Option `--luatex` fixed (extra empty page at end).|
|2010/09/03 v1.27:| \* Workaround of v1.24 fixed.|
|2010/09/06 v1.28:| \* The Windows registry is searched if Ghostscript is not found via PATH.
|-- | \* Windows only: support of spaces in command names in unrestricted mode.|
|2010/09/06 v1.29:| \* Find the latest Ghostscript version in registry.|
|2010/09/15 v1.30:| \* Warning of pdfTeX because of \pdfobjcompresslevel avoided when reducing \pdfminorversion.|
|-- | \* Fix for TeX syntax characters in input file names.|
|2010/09/17 v1.31:| \* Passing the input file name via hex string to TeX.|
|-- | \* Again input file names restricted for Ghostscript command line, switch then to symbol link/copy method.|
|2011/08/10 v1.32:| \* Detection for gswin64c.exe added.|
|2012/02/01 v1.33:| \* Input file can be `-` (standard input).|
|2012/04/18 v1.34:| \* Format of option `--version` changed from naked version number to a line with program name, date and version.|
|2012/10/15 v1.35:| \* Additional debug infos added for Perl version.|
|2012/10/16 v1.36:| \* More error codes added.|
|2012/10/16 v1.37:| \* Extended error messages if available.|
|-- | \* Fix for broken v1.36.|
|2012/11/02 v1.38:| \* Fix for unsufficient cleanup, if function `cleanup` is prematurely called in `eval` for `symlink` checking.|
|2020/05/24 v1.39:| \* adapted to pdfversion 2.0,|
|-- | \* corrected luatex support|
|-- | \* corrected a problem with xetex.|
|2020/06/06 v1.40:| \* improved ghostscript detection on windows when a bash is used|
|-- | \* added direct pdfversion support to xetex.|
|2023/04/13 v1.41:| \* allow gswin64c in restricted mode, fix typos in messages issues 14, 17|
|-- | \* add -q option, issue 7 |
|-- | \* don't print whole help msg for unknown options, issue 7.|
|-- | \* do not create two pages with xetex, issue 3|
|2023/04/15 v1.42:| \* update help text issue 18|
## 13. TODO
* Description of user interface.
* Documentation in other formats, eg. man or info pages.
* Improved error checking.
* Units support for option `--margins`.
|