0

課したいpdfがあります。8.5x11 インチのページ、メディア ボックス、クロップ ボックスがあります。隣接するページを結合して、pdf を 17x11 インチのページにしたいと考えています。残念ながら、ほとんどのページのコンテンツは完全にクロップ ボックスの外にあるか、クロップ ボックスにまたがっています。各ページには 1 つのストリームとクロップ ボックスのみを含めることができるため、適用すると、重なっているコンテンツが表示されます。これは悪いです。

DPIを事前に修正するため、pdfをラスタライズしたくありません。したがって、ページを画像としてエクスポートし、画像を追加して (imagemagick)、これらのペアの画像を新しい pdf に埋め込むことは考慮しません。

あとがきに課す問題もありました - 透明度、フォントのラスタライズ、および pdf->ps->pdf 変換中のその他の視覚的な不具合に関する問題です。

答えはスクリプト可能でなければなりません。

これまでのところ、私は試しました:

  • podofo インポジション スクリプト (lua)
  • PyPDF2 (パイソン)
  • ゴーストスクリプト
  • ラテックス

Ghostscript はトリミング ボックスの外側のコンテンツを削除しますか?」という質問は、ghostscript の pdfwrite モジュールが、出力 PDF ファイルを生成するときに、トリミング ボックスに従ってコンテンツをラスタライズおよびトリミングすることを示唆しています。したがって、ghostscript の pdfwrite モジュールを介して自分の pdf をパイプするだけで済みます。残念ながら、これはうまくいきません。

証拠を介してpdfを別のpdfに印刷しようとしたとき、私はあきらめようとしていました。それは完全に機能します - クロップボックス内のテキストとベクター要素はラスタライズされず、クロップボックスの外側の要素は削除されます (またがる要素はまだテストしていません)。品質は高く、解像度 (ページ サイズ) と外観は同じです。実際、メタデータ以外はすべて同じように見えます。

そう:

  • 質問は可能です
  • 答えはすでにある

どうすればアクセスできますか?

pdftopdfこの機能は、カップのバイナリによって提供される可能性があると思います。外部バイナリの呼び出しに問題はありません....しかし、使用方法がわかりませんpdftopdf

編集: test pdf へのリンク。これには、ラスター、ベクター、およびテキスト アイテム (一部は部分的に透明なアイテムによって部分的に遮られています) が含まれており、隣接するページにまたがって隣接しています。この PDF をカップを通して印刷すると、クロップ ボックスの外側のすべてのコンテンツがクロップされるように見えます。ただし、フィルター処理された pdf をinkscape で開くと、トリミングされたテキストを除いて、ページ外のアイテムがトリミングされずに個別にマスクされていることがわかります。

4

2 に答える 2

1

トリックは、フォーム XObjects を使用して、1 つのページ内に複数のページを面付けすることです。Form XObjects は PDFページ全体を参照でき、独立したクリップを維持できます。PyPDF2 は Form XObjects をサポートしていないため、マージによってすべての入力ページのストリームが統合され、出力ページのクリップ/メディア ボックスが共有されます。私は pdflatex と pdfrw (python) の両方を使用することに成功しました - テストプログラムは以下にインライン化されています。フォーム XObjects は同様のポストスクリプト レベル 2 機能から派生しているため、KenSが示唆するように、「ページ クリップ」を使用してゴーストスクリプトで同じ目標を達成できるはずです。実際、彼は別の回答でゴーストスクリプトの 2x1 面付けスクリプトを共有しましたが、それは恐ろしく複雑に見えます。poppler のフォントのラスタライズの問題と組み合わせるpdftops (互換性レベル > 1.4 であっても)、ゴーストスクリプトのアプローチを放棄しました。

2 つの PDF ページを 1 つの大きなページとしてつなぎ合わせるには?から派生したラテックス スクリプト . pdflatex が必要です:

\documentclass{article}
\usepackage{pdfpages}
\usepackage[paperwidth=8.5in, paperheight=11in]{geometry}
\usepackage[multidot]{grffile}
\pagestyle{plain}

\begin{document}
    \setlength\voffset{+0.0in}
    \setlength\hoffset{+0.0in}

    \includepdf[ noautoscale=true
               , frame=false
               , pages={1}
               ]
               {<file.pdf>}

    \eject \paperwidth=17in \pdfpagewidth=17in \paperheight=11in \pdfpageheight=11in 

    \includepdf[ nup=2x1
               , noautoscale=true
               , frame=false
               , pages={2-,}
               ]
               {<file.pdf>}
\end{document}

pdfrw :examples:bookletから派生した pdfrw (python スクリプト) 。pdfrw >= 0.2 が必要:

#!/usr/bin/env python3

# Copyright:
#   Yclept Nemo
#       2016
# License:
#   GPLv3

import itertools
import argparse
import pdfrw

# from itertool recipes in the python documentation
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

def pagemerge(page, *pages):
    merged = pdfrw.PageMerge() + page
    for page in reversed(list(itertools.takewhile(lambda i: i is not None, reversed(pages)))):
        merged = merged + page
        merged[-1].x = merged[-2].x + merged[-2].w
    return merged.render()

parser = argparse.ArgumentParser(description='Impose PDF files using Form XOBjects')

parser.add_argument\
    ( "source"
    , help="PDF, source path"
    , type=pdfrw.PdfReader
    )
parser.add_argument\
    ( "-s", "--spacer"
    , help="PDF, spacer path"
    , type=lambda fp: next(iter(pdfrw.PdfReader(fp).pages), None)
    )
parser.add_argument\
    ( "target"
    , help="PDF, target path"
    )

args = parser.parse_args()

pages = args.source.pages[:1]

for pair in grouper(args.source.pages[1:], 2):
    assert pair[0] is not None
    pages.append(pagemerge(pair[0], args.spacer, pair[1]))

# include metadata in target
target = pdfrw.PdfWriter()
target.addpages(pages)
target.trailer.Info = args.source.Info
target.write(args.target)

pdfrw 0.2 でのいくつかの特異点:

  • pdfrw.PageMerge はリストのように動作しますが、操作+=とは定義されていないことに注意してください。さらに、左側のオブジェクトを変更するという点で同様に機能します。appendextend++=
于 2016-04-08T20:36:34.740 に答える