0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pdfcropでOperation not permittedが発生する場合の修正方法

Last updated at Posted at 2023-01-04

概要

Windows OSにて,pdfcropを使用するとき Operation not permitted とのエラーが発生する場合の修正方法を示す.

注意事項

本文書の作成者は,Perlについてまったく知らない.本文書に書かれた情報を参考にする場合は,自己責任で実行されたい.

環境

具体的な症状

以下のようなエラーが発生する.

powershell
> 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_existssymlink が使用できるか判定して,不可能な場合は else 内の copy を実行しようとしているように見えるが,なぜかWindows OSだと動作していない.そのため,Windows OSで使用していることが判定された場合は, else に移行するようにする.具体的には, pdfcrop.pl の上のほう(l.124行目あたり)で,Windows OSと判定されたときは, $Win = 1 となるためこれを利用する.

pdfcrop.pl
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;
}

その他

上の内容については,プルリクを送ってあります.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?