web-dev-qa-db-ja.com

各PDFページを2つに分割しますか?

PDFファイルが多数あり、1ページに2つのスライドが含まれています(印刷用))。

フォーマットはA4ページで、次のように2つのスライドが設定されています。

-----------
| slide 1 |
-----------
| slide 2 |
-----------

どのように新しいPDFページごとに1つのスライドを含むファイル)を生成できますか?

GUI、CLI、スクリプト、または言語のPDFライブラリとのインターフェイスさえも使用できますが、スライド上のテキストを引き続き選択可能にする必要があります。

25

PDFはさみ を使用すると、PDF内のすべてのページを一括分割(トリミング)できました。

20

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は最小限ですが、機能します。コマンドラインからも使用できます。

10
Nicolas Payette

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()
8
moraes

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()
5

[〜#〜] briss [〜#〜] を試してください。

alt text

GUIで領域を定義することにより、各ページを必要な数のサブページに分割できます。類似したすべてのページがグループにグループ化されるため、そのグループのリージョンを一度定義できます。

クロスプラットフォーム、無料、オープンソースです。

(コピー https://superuser.com/a/235327/35237 から貼り付け)

1
Tobias Kienzler

その答えのモーラに感謝します。私の場合、結果の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()
0
Matt Gumbley

Javaまたは.Netライブラリを使用しても問題ない場合は、iText/iTextSharpを使用できます。

既存のドキュメントをタイリングする例は、無料で入手できる 第6章TilingHero.Java / TilingHero .cs

0
mkl

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だけ大きいです!)

0
Gepi