PDFファイルが多数あり、1ページに2つのスライドが含まれています(印刷用))。
フォーマットはA4ページで、次のように2つのスライドが設定されています。
-----------
| slide 1 |
-----------
| slide 2 |
-----------
どのように新しいPDFページごとに1つのスライドを含むファイル)を生成できますか?
GUI、CLI、スクリプト、または言語のPDFライブラリとのインターフェイスさえも使用できますが、スライド上のテキストを引き続き選択可能にする必要があります。
PDFはさみ を使用すると、PDF内のすべてのページを一括分割(トリミング)できました。
mutool
はこのために活発に機能します。以下の例では、input.pdf
の各ページを3つの水平部分と8つの垂直部分に分割します(したがって、入力1つごとに24ページの出力を作成します)。
mutool poster -x 3 -y 8 input.pdf output.pdf
mutool
をインストールするには、 mupdf
をインストールするだけです。これは、ほとんどのGNU/Linuxディストリビューションにパッケージされている可能性があります。
( marttt へのクレジット)
UbuntuのようなdebianベースのLinuxシステムでは、次を使用してインストールできます。
Sudo apt install mupdf
Sudo apt install mupdf-tools
Briss は、「トリミング用のシンプルなクロスプラットフォーム(Linux、Windows、Mac OSX)アプリケーションですPDFファイル。シンプルなユーザーインターフェイスで、トリミング領域を正確に定義できます。視覚的にオーバーレイされたページに長方形をはめ込みます。」それはオープンソース(GPL)です。
私にはうまくいきます。 GUIは最小限ですが、機能します。コマンドラインからも使用できます。
Python PyPDFと呼ばれるライブラリを使用できます。この関数は、ページの向きに関係なく、二重ページを分割します:
import copy
import math
import pyPdf
def split_pages(src, dst):
src_f = file(src, 'r+b')
dst_f = file(dst, 'w+b')
input = pyPdf.PdfFileReader(src_f)
output = pyPdf.PdfFileWriter()
for i in range(input.getNumPages()):
p = input.getPage(i)
q = copy.copy(p)
q.mediaBox = copy.copy(p.mediaBox)
x1, x2 = p.mediaBox.lowerLeft
x3, x4 = p.mediaBox.upperRight
x1, x2 = math.floor(x1), math.floor(x2)
x3, x4 = math.floor(x3), math.floor(x4)
x5, x6 = math.floor(x3/2), math.floor(x4/2)
if x3 > x4:
# horizontal
p.mediaBox.upperRight = (x5, x4)
p.mediaBox.lowerLeft = (x1, x2)
q.mediaBox.upperRight = (x3, x4)
q.mediaBox.lowerLeft = (x5, x2)
else:
# vertical
p.mediaBox.upperRight = (x3, x4)
p.mediaBox.lowerLeft = (x1, x6)
q.mediaBox.upperRight = (x3, x6)
q.mediaBox.lowerLeft = (x1, x2)
output.addPage(p)
output.addPage(q)
output.write(dst_f)
src_f.close()
dst_f.close()
Python Scriptを作成してくれたMatt Gumbleyに感謝します。Pythonスクリプトを変更して、縦向きと横向きのページとトリミングされたページを含むPDFでも動作するようにしました:
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 26 08:49:39 2015
@author: Matt Gumbley (stackoverflow)
changed by Hanspeter Schmid to deal with already cropped pages
"""
import copy
import math
from PyPDF2 import PdfFileReader, PdfFileWriter
def split_pages2(src, dst):
src_f = file(src, 'r+b')
dst_f = file(dst, 'w+b')
input = PdfFileReader(src_f)
output = PdfFileWriter()
for i in range(input.getNumPages()):
# make two copies of the input page
pp = input.getPage(i)
p = copy.copy(pp)
q = copy.copy(pp)
# the new media boxes are the previous crop boxes
p.mediaBox = copy.copy(p.cropBox)
q.mediaBox = copy.copy(p.cropBox)
x1, x2 = p.mediaBox.lowerLeft
x3, x4 = p.mediaBox.upperRight
x1, x2 = math.floor(x1), math.floor(x2)
x3, x4 = math.floor(x3), math.floor(x4)
x5, x6 = x1+math.floor((x3-x1)/2), x2+math.floor((x4-x2)/2)
if (x3-x1) > (x4-x2):
# horizontal
q.mediaBox.upperRight = (x5, x4)
q.mediaBox.lowerLeft = (x1, x2)
p.mediaBox.upperRight = (x3, x4)
p.mediaBox.lowerLeft = (x5, x2)
else:
# vertical
p.mediaBox.upperRight = (x3, x4)
p.mediaBox.lowerLeft = (x1, x6)
q.mediaBox.upperRight = (x3, x6)
q.mediaBox.lowerLeft = (x1, x2)
p.artBox = p.mediaBox
p.bleedBox = p.mediaBox
p.cropBox = p.mediaBox
q.artBox = q.mediaBox
q.bleedBox = q.mediaBox
q.cropBox = q.mediaBox
output.addPage(q)
output.addPage(p)
output.write(dst_f)
src_f.close()
dst_f.close()
[〜#〜] briss [〜#〜] を試してください。
GUIで領域を定義することにより、各ページを必要な数のサブページに分割できます。類似したすべてのページがグループにグループ化されるため、そのグループのリージョンを一度定義できます。
クロスプラットフォーム、無料、オープンソースです。
(コピー https://superuser.com/a/235327/35237 から貼り付け)
その答えのモーラに感謝します。私の場合、結果のPDFはAdobe ReaderとMacプレビューでは問題なく表示されましたが、iOSで表示すると、別のページに分割されているようには見えません。Python 2.7.8とPyPDF 2を使用して、スクリプトを次のように変更し、正常に機能しました(ページを右/左ではなく、左/右に並べ替えました)。
import copy
import math
from PyPDF2 import PdfFileReader, PdfFileWriter
def split_pages(src, dst):
src_f = file(src, 'r+b')
dst_f = file(dst, 'w+b')
input = PdfFileReader(src_f)
output = PdfFileWriter()
for i in range(input.getNumPages()):
p = input.getPage(i)
q = copy.copy(p)
q.mediaBox = copy.copy(p.mediaBox)
x1, x2 = p.mediaBox.lowerLeft
x3, x4 = p.mediaBox.upperRight
x1, x2 = math.floor(x1), math.floor(x2)
x3, x4 = math.floor(x3), math.floor(x4)
x5, x6 = math.floor(x3/2), math.floor(x4/2)
if x3 > x4:
# horizontal
p.mediaBox.upperRight = (x5, x4)
p.mediaBox.lowerLeft = (x1, x2)
q.mediaBox.upperRight = (x3, x4)
q.mediaBox.lowerLeft = (x5, x2)
else:
# vertical
p.mediaBox.upperRight = (x3, x4)
p.mediaBox.lowerLeft = (x1, x6)
q.mediaBox.upperRight = (x3, x6)
q.mediaBox.lowerLeft = (x1, x2)
p.artBox = p.mediaBox
p.bleedBox = p.mediaBox
p.cropBox = p.mediaBox
q.artBox = q.mediaBox
q.bleedBox = q.mediaBox
q.cropBox = q.mediaBox
output.addPage(q)
output.addPage(p)
output.write(dst_f)
src_f.close()
dst_f.close()
Javaまたは.Netライブラリを使用しても問題ない場合は、iText/iTextSharpを使用できます。
既存のドキュメントをタイリングする例は、無料で入手できる 第6章 : TilingHero.Java / TilingHero .cs 。
mupdf-1.8-windows-x64
、win10 CMDでは、水平パラメーター(-x)の前に 'poster'(スペースが続き、引用符なし)が必要です。たとえば、PDFへの二重ページスキャンの場合:
mutoolのポスター-x 2 -y 1 C:\ Users\alfie\Documents\SNM\The_Ultimate_Medicine.pdf C:\ Users\alfie\Documents\ebooks\The_Ultimate_Medicine.pdf
なんて素晴らしいツールでしょう! Merci infiniment!..(そして出力ファイル〜9MBはオリジナルより52KBだけ大きいです!)