35

複数ページのPDFをGhostscriptで分割しようとすると、同じ解決策がより多くのサイトで、さらにはghostscript.comでも見つかりました。

gs -sDEVICE=pdfwrite -dSAFER -o outname.%d.pdf input.pdf

しかし、すべてのページとoutname.1.pdfという名前の1つのファイルが生成されるため、私には機能していないようです。

開始ページと終了ページを追加すると、正常に機能していますが、これらのパラメーターを知らなくても機能するようにしたいと思います。

gs-develアーカイブで、これに対する解決策を見つけました:http: //ghostscript.com/pipermail/gs-devel/2009-April/008310.html-しかし、私はそれなしでそれをやりたいと思っていpdf_infoます。

たとえばpswrite、別のデバイスを使用しているが、同じパラメーターを使用している場合、それは正しく機能し、 input.pdfに含まれている数のpsファイルを生成します。

使用するとき、これは正常pdfwriteですか?私は何か間違ったことをしていますか?

4

7 に答える 7

28

ワイマー氏が書いたこのスクリプトは非常に便利だと思いました。

#!/bin/sh
#
# pdfsplit [input.pdf] [first_page] [last_page] [output.pdf] 
#
# Example: pdfsplit big_file.pdf 10 20 pages_ten_to_twenty.pdf
#
# written by: Westley Weimer, Wed Mar 19 17:58:09 EDT 2008
#
# The trick: ghostscript (gs) will do PDF splitting for you, it's just not
# obvious and the required defines are not listed in the manual page. 

if [ $# -lt 4 ] 
then
        echo "Usage: pdfsplit input.pdf first_page last_page output.pdf"
        exit 1
fi
gs -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$4" -dFirstPage=$2 -dLastPage=$3 -sDEVICE=pdfwrite "$1"

起源:http ://www.cs.virginia.edu/~weimer/pdfsplit/pdfsplit

として保存しpdfsplit.sh、魔法が起こるのを見てください。

PDFSAMもその仕事をすることができます。WindowsとMacで利用できます。

于 2012-05-09T04:34:59.997 に答える
14

表示されるのは「通常の」動作です。Ghostscriptのpdfwrite出力デバイスの現在のバージョンはこの機能をサポートしていません。これも(確かに、どういうわけか漠然と)Use.htmに文書化されています:

「ただし、ファイルごとに1ページの機能がすべてのデバイスでサポートされているとは限らないことに注意してください。...」

Ghostscript開発者の1人がIRCで、将来のリリースでこの機能をpdfwriteに追加する可能性があると述べたことを覚えているようですが、主要なコードの書き直しが必要なようです。そのため、まだ行っていません...


更新: Gordonのコメントがすでに示唆しているように、バージョン9.06(2012年7月31日にリリース)の時点で、Ghostscriptは、の質問でも引用されているコマンドラインをサポートするようになりましたpdfwrite。(ゴードンは、9.05ですでにこれに対する非公式のサポートを発見したか、9.06としてまだタグ付けされていないプレリリースソースから彼自身の実行可能ファイルをコンパイルしたに違いありません)。

于 2012-04-19T14:53:42.027 に答える
5
 #!/bin/bash
#where $1 is the input filename

ournum=`gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit" 2>/dev/null`
echo "Processing $ournum pages"
counter=1
while [ $counter -le $ournum ] ; do
    newname=`echo $1 | sed -e s/\.pdf//g`
    reallynewname=$newname-$counter.pdf
    counterplus=$((counter+1))
    # make the individual pdf page
    yes | gs -dBATCH -sOutputFile="$reallynewname" -dFirstPage=$counter -dLastPage=$counter -sDEVICE=pdfwrite "$1" >& /dev/null
    counter=$counterplus
done
于 2013-11-10T02:40:43.297 に答える
5

Ghostscriptがインストールされていると仮定した場合のWindowsコマンドプロンプトのスクリプト(ドラッグアンドドロップでも機能します)は次のとおりです。

@echo off
chcp 65001
setlocal enabledelayedexpansion

rem Customize or remove this line if you already have Ghostscript folders in your system PATH
set path=C:\Program Files\gs\gs9.22\lib;C:\Program Files\gs\gs9.22\bin;%path%

:start

echo Splitting "%~n1%~x1" into standalone single pages...
cd %~d1%~p1
rem getting number of pages of PDF with GhostScript
for /f "usebackq delims=" %%a in (`gswin64c -q -dNODISPLAY -c "(%~n1%~x1) (r) file runpdfbegin pdfpagecount = quit"`) do set "numpages=%%a"

for /L %%n in (1,1,%numpages%) do (
echo Extracting page %%n of %numpages%...
set "x=00%%n"
set "x=!x:~-3!"
gswin64c.exe -dNumRenderingThreads=2 -dBATCH -dNOPAUSE -dQUIET -dFirstPage=%%n -dLastPage=%%n -sDEVICE=pdfwrite -sOutputFile="%~d1%~p1%~n1-!x!.pdf" "%1"
)

shift
if NOT x%1==x goto start

pause

このスクリプトに次のような名前split PDF.batを付けて、デスクトップに配置します。1つ(またはそれ以上)の複数ページのPDFをドラッグアンドドロップすると、PDFのページごとに1つのスタンドアロンPDFファイルが作成され、ページを区別するために名前に接尾辞-001などが追加されます。-002

set path=...システムのPATH環境変数にGhostscriptフォルダーが既にある場合は、(関連するGhostscriptバージョンを使用して)カスタマイズするか、行を削除する必要がある場合があります。

これは、Ghostscript9.22を使用するWindows10で動作します。Ghostscript 9.50+で動作させるには、コメントを参照してください。

楽しみ。

于 2018-07-11T11:56:06.397 に答える
2

これを行う簡単なPythonスクリプトは次のとおりです。

#!/usr/bin/python3

import os

number_of_pages = 68
input_pdf = "abstracts_rev09.pdf"

for i in range(1, number_of_pages +1):
    os.system("gs -q -dBATCH -dNOPAUSE -sOutputFile=page{page:04d}.pdf"
              " -dFirstPage={page} -dLastPage={page}"
              " -sDEVICE=pdfwrite {input_pdf}"
              .format(page=i, input_pdf=input_pdf))
于 2015-08-27T21:33:53.807 に答える
0

pdftk.exeGhostscriptを呼び出さずに、のみに依存する回答を更新しました

ユーザー@mmjによって提供された回答は、以前は問題なく機能していましたが、GSバージョン9.20と9.50の間のどこかで機能しなくなりました。@Adobeが提供するソリューションも知っています。ただし、1つ以上のファイルを選択し、右クリック→[送信]を選択して、Windows(10)エクスプローラーから定期的なタスクを実行するのが好きです。pdftk.exeこれは、 (2.02でテストされた)を使用してページの総数をカウントし、すべてを単一のファイルに抽出するPythonスクリプト(3.8と互換性があります)です。入力として複数のPDFを受け入れる必要があります。pdftk.exePythonがあり、PATH内にあることを確認してください。

これに名前extract-pdf-pages-py.cmdを付けて、次の場所に配置しshell:sendtoます。

python %APPDATA%\Microsoft\Windows\SendTo\extract-pdf-pages-py.py %*

extract-pdf-pages-py.py同じフォルダに次のものを入れます。

#!/usr/bin/python3
# put as extract-pdf-pages-py.py to shell:sendto

import os
import subprocess
import re
import sys
import mimetypes


def is_tool(name):
    from shutil import which
    return which(name) is not None


if not is_tool('pdftk'):
    input('pdftk.exe not within PATH. Aborting...')
    raise SystemExit("pdftk.exe not within PATH.")

sys.argv.pop(0)

for j in range(len(sys.argv)):
    input_pdf = sys.argv[j]

    if 'application/pdf' not in mimetypes.guess_type(input_pdf):
        input(f"File {input_pdf} is not a PDF. Skipping...")
        continue

    savefile = input_pdf.rstrip('.pdf')

    numpages = subprocess.Popen(f"pdftk \"{input_pdf}\" dump_data", shell=True, stdout=subprocess.PIPE)
    output1 = str(numpages.communicate()[0])
    output2 = re.search("NumberOfPages: ([0-9]*)", output1)
    number_of_pages = int(output2.group(1))

    for i in range(1, number_of_pages + 1):
        os.system(f"pdftk \"{input_pdf}\" cat {i} output \"{savefile}\"{i:04d}.pdf")

私はこの回答(@Adobeによるスクリプト)とその回答( )のコードを使用しましis_toolた。

于 2020-09-23T18:54:04.813 に答える
0

gsは昇順の注文ページのみを受け入れます。ソースからのページをシャッフル(つまり、7、8、5番目)するために、〜/.bashrcの関数を作成しました。

function expdf
{
local str=""
local arr=($(echo $1 | tr "," "\n"))
#          splitting
for i in "${arr[@]}";do
  gs -dBATCH -sDEVICE=pdfwrite -sPageList=$i -dNOPAUSE -sOutputFile=$i.tmp $2
#          reordering for combining
  str="$str $i.tmp"
done
#          combining to combine.pdf
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=combine.pdf -dBATCH $str
#          removing temporary files
for i in "${arr[@]}";do rm $i.tmp;done
}

使用例:expdf 7-8,5 source.pdf

于 2021-12-21T16:45:21.233 に答える