30

1ページに2枚のスライドがあるPDFファイルがたくさんあります(印刷用)。

形式はA4ページで、それぞれ2つのスライドが次のように設定されています。

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

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

GUI、CLI、スクリプト、さらには言語のPDFライブラリとのインターフェースを使用できます。ただし、スライドのテキストを選択できるようにする必要があります。

4

10 に答える 10

21

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

于 2012-11-16T10:15:46.667 に答える
13

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
于 2016-02-10T14:35:07.220 に答える
10

Brissは、「PDFファイルをトリミングするためのシンプルなクロスプラットフォーム(Linux、Windows、Mac OSX)アプリケーションです。シンプルなユーザーインターフェイスを使用すると、視覚的にオーバーレイされたページに長方形を配置することで、トリミング領域を正確に定義できます。」それはオープンソース(GPL)です。

私にとってはうまくいきます。GUIは最小限ですが、機能します。コマンドラインからも使用できます。

于 2013-09-05T03:55:00.617 に答える
9

PyPDFと呼ばれるPythonライブラリを使用できます。この関数は、ページの向きに関係なく、2つのページを分割します。

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()
于 2013-04-01T12:23:41.880 に答える
6

Pythonスクリプトを提供してくれたMattGumbleyに感謝します。私はその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()
于 2015-02-26T08:29:54.873 に答える
2

これが私がそれをした方法ですpdfrw

import sys, os, pdfrw
writer = pdfrw.PdfWriter()
for page in pdfrw.PdfReader('input.pdf').pages:
    for y in [0, 0.5]:
        newpage = pdfrw.PageMerge()    
        newpage.add(page, viewrect=(0, y, 1, 0.5))
        writer.addpages([newpage.render()])
writer.write('output.pdf')

短くて機能しています!

回転させたい場合(例:A4ポートレートを入力し、横向きではなく2 A5ポートレートを出力):

import sys, os, pdfrw
writer = pdfrw.PdfWriter()
for page in pdfrw.PdfReader('input.pdf').pages:
    for y in [0, 0.5]:
        newpage = pdfrw.PageMerge()    
        newpage.add(page, viewrect=(0, y, 1, 0.5))
        p = newpage.render()
        p.Rotate = 270
        writer.addpages([p])
writer.write('output.pdf')
于 2020-06-01T17:14:34.577 に答える
1

BRISSをお試しください。

代替テキスト

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

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

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

于 2014-12-01T10:46:13.133 に答える
0

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

既存のドキュメントをタイリングする例は、無料で入手できる第6章TilingHero.java/TilingHero.csのiTextinAction 、第2版にあります。

于 2012-11-12T14:54:55.007 に答える
0

その答えをくれたmoraesに感謝します。私の場合、結果のPDFはAdobe ReaderとMacプレビューでは問題なく表示されましたが、iOSで表示したときに別々のページに分割されたようには見えませんでした。Python2.7.8とPyPDF2を使用し、スクリプトを次のように変更しました。これは正常に機能しました。(そして、ページを右/左ではなく、左/右に並べ替えました)。

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()
于 2014-11-14T08:54:17.537 に答える
0

を使用mupdf-1.8-windows-x64すると、win10 CMDでは、水平方向のパラメーター(-x)の前に「ポスター」(スペースが続き、引用符は不要)が必要です。たとえば、PDFへの2ページスキャンの場合:

mutoolポスター-x2-y 1 C:\ Users \ alfie \ Documents \ SNM \ The_Ultimate_Medicine.pdf C:\ Users \ alfie \ Documents \ ebooks \ The_Ultimate_Medicine.pdf

なんて素晴らしいツールでしょう。Merci infiniment!..(そして、出力ファイル〜9MBは元のファイルよりわずか52KB大きいです!)

于 2016-04-07T04:41:20.170 に答える