概要
Windows OSにて,pdfcropを使用するとき Operation not permitted
とのエラーが発生する場合の修正方法を示す.
注意事項
本文書の作成者は,Perlについてまったく知らない.本文書に書かれた情報を参考にする場合は,自己責任で実行されたい.
環境
- Windows 10 Pro 22H2
- TeX Live 2022
- pdfcrop 1.40
- 次の方法でインストールした:TeX Liveのインストール
具体的な症状
以下のようなエラーが発生する.
> pdfcrop.exe .\figures.pdf
PDFCROP 1.40, 2020/06/06 - Copyright (c) 2002-2020 by Heiko Oberdiek, Oberdiek Package Support Group.
!!! Error: Link from `.\figures.pdf' to `tmp-pdfcrop-25824-img.pdf' failed (Operation not permitted/クライアントは要求された特権を保有していません。)!
C:\texlive\2022\bin\win32\runscript.tlu:915: command failed with exit code 2:
perl.exe c:\texlive\2022\texmf-dist\scripts\pdfcrop\pdfcrop.pl .\figures.pdf
手っ取り早く修正する方法
pdfcrop.pl
にWindowsで発生するバグがあるようである.修正版を作成したため,このリンクから pdfcrop.pl
をダウンロードして, C:\texlive\2022\texmf-dist\scripts\pdfcrop
に保存する.既存の pdfcrop.pl
は念のためバックアップしておくことを推奨する.
TeX Liveのバージョンが2022でない場合,そのバージョンにあわせて保存してすること.例えば2021の場合は, C:\texlive\2021\texmf-dist\scripts\pdfcrop
となる.
TeX Liveのインストール先が C:\texlive
でない人もいるかもしれないが,そのときは適宜対応されたい.
原因と具体的な変更内容
変換時に一時ファイルを作成するようであるが,これをシンボリックリンクで作成すること (symlink
) がエラーの原因のようである.Windows OSにてシンボリックリンクを作成するには管理者権限を要するため,パーミッションエラーが発生する.
pdfcrop.pl
の701行目あたりを見ると, $symlink_exists
で symlink
が使用できるか判定して,不可能な場合は else
内の copy
を実行しようとしているように見えるが,なぜかWindows OSだと動作していない.そのため,Windows OSで使用していることが判定された場合は, else
に移行するようにする.具体的には, pdfcrop.pl
の上のほう(l.124行目あたり)で,Windows OSと判定されたときは, $Win = 1
となるためこれを利用する.
my $symlink_exists = eval {
local $SIG{'__DIE__'};
symlink("", "");
1;
};
print "* Input file name `$inputfile' contains special characters.\n"
. "* " . ($symlink_exists ? "Link" : "Copy")
. " input file to temporary file `$inputfilesafe'.\n"
if $::opt_verbose;
- if ($symlink_exists) {
+ if (not $Win and $symlink_exists) {
symlink($inputfile, $inputfilesafe)
or die sprintf "$Error Link from `%s' to `%s' failed (%s)!\n",
$inputfile, $inputfilesafe, exterr;
}
else {
use File::Copy;
copy($inputfile, $inputfilesafe)
or die sprintf "$Error Copy from `%s' to `%s' failed (%s)\n",
$inputfile, $inputfilesafe, exterr;
}
その他
上の内容については,プルリクを送ってあります.