23

プログラムで .pdf ファイルを操作した経験がある人がいるかどうか疑問に思っていました。.pdf ファイルがあり、すべてのページを特定のサイズにトリミングする必要があります。

Googleで簡単に検索した後、pythonのpyPdfライブラリを見つけましたが、それを使った実験は失敗しました。ページ オブジェクトの cropBox 属性と trimBox 属性を変更したところ、結果は期待したものではなく、非常にランダムに見えました。

誰もこれを経験したことがありますか?コード例は、できれば python で高く評価されます。

4

7 に答える 7

37

pyPdfは、この分野で私が期待することを行います。次のスクリプトを使用します。

#!/usr/bin/python
#

from pyPdf import PdfFileWriter, PdfFileReader

with open("in.pdf", "rb") as in_f:
    input1 = PdfFileReader(in_f)
    output = PdfFileWriter()

    numPages = input1.getNumPages()
    print "document has %s pages." % numPages

    for i in range(numPages):
        page = input1.getPage(i)
        print page.mediaBox.getUpperRight_x(), page.mediaBox.getUpperRight_y()
        page.trimBox.lowerLeft = (25, 25)
        page.trimBox.upperRight = (225, 225)
        page.cropBox.lowerLeft = (50, 50)
        page.cropBox.upperRight = (200, 200)
        output.addPage(page)

    with open("out.pdf", "wb") as out_f:
        output.write(out_f)

結果のドキュメントには、200x200 ポイントのトリム ボックスがあり、メディア ボックス内の 25,25 ポイントから始まります。クロップ ボックスは、トリム ボックス内の 25 ポイントです。

上記のコードで処理した後、私のサンプル ドキュメントが acrobat professional でどのように見えるかを次に示します。 ページのスクリーンショットを切り抜く

このドキュメントを acrobat リーダーに読み込むと、空白で表示されます。

于 2009-01-21T16:12:44.507 に答える
4

トリミングする座標を知るにはどうすればよいですか?

上記のすべての回答に感謝します。

ステップ 1. 次のコードを実行して (x1, y1) を取得します。

from PyPDF2 import PdfFileWriter, PdfFileReader

input = PdfFileReader(open("test.pdf","rb"))
page = input.getPage(0)
print(page.cropBox.getUpperRight())

ステップ 2. 全画面モードで PDF ファイルを表示します。

ステップ 3. 画面を画像ファイル screen.jpg としてキャプチャします。

ステップ 4. M$ ペイントまたは GIMP で screen.jpg を開きます。これらのアプリケーションは、カーソルの座標を表示します。

ステップ 5. (x2, y2)、(x3, y3)、(x4, y4)、(x5, y5) の座標を覚えておいてください。作物。

ここに画像の説明を入力

Step 6. 次の式で page.cropBox.upperLeft と page.cropBox.lowerRight を取得します。計算ツールはこちら。

page.cropBox.upperLeft = (x1*(x4-x2)/(x3-x2),(1-y4/y3)*y1)
page.cropBox.lowerRight = (x1*(x5-x2)/(x3-x2),(1-y5/y3)*y1)

ステップ 7. 次のコードを実行して、pdf ファイルをトリミングします。

from PyPDF2 import PdfFileWriter, PdfFileReader

output = PdfFileWriter() 
input = PdfFileReader(open('test.pdf', 'rb')) 

n = input.getNumPages()

for i in range(n):
  page = input.getPage(i)
  page.cropBox.upperLeft = (100,200)
  page.cropBox.lowerRight = (300,400)
  output.addPage(page) 
  
outputStream = open('result.pdf','wb') 
output.write(outputStream) 
outputStream.close() 
于 2021-07-04T13:57:09.727 に答える
2

あなたはおそらく無料の解決策を探していますが、お金があれば、PDFlibは素晴らしいライブラリです。それは私を失望させたことはありません。

于 2009-01-19T16:24:51.767 に答える
0

PDFをPostscript(pstopdfまたはps2pdf)に変換してから、Postscriptファイルでテキスト処理を使用できます。その後、出力をPDFに戻すことができます。

これは、処理するPDFがすべて同じアプリケーションによって生成され、多少類似している場合にうまく機能します。それらが異なるソースからのものである場合、通常、Postscriptファイルを処理するのは困難です-構造は大きく異なります。しかし、あなたがmigtでさえ、いくつかの正規表現でページサイズなどを修正することができます。

于 2009-01-19T22:54:55.833 に答える
0

Acrobat Javascript API には setPageBoxes メソッドがありますが、Adobe は Python コード サンプルを提供していません。C++、C#、および VB のみ。

于 2009-01-19T23:39:01.797 に答える