0

ESRI ArcMap 10 のデータ ドリブン ページを使用して、一連の PDF ドキュメント (マップ) を作成しました。個別の *.mxd から生成されたマップごとに、ページ 1 とページ 2 があります。したがって、各マップのページ 1 を含む PDF ドキュメントのリストと、各マップのページ 2 を含む PDF ドキュメントのリストが 1 つあります。例: Map1_001.pdf、map1_002.pdf、map1_003.pdf...map2_001.pdf、map2_002.pdf、map2_003.pdf...など。

これらのマップ、ページ 1 と 2 を一緒に追加して、ページ 1 と 2 の両方がマップごとに 1 つの PDF にまとめられるようにしたいと思います。例: mapboth_001.pdf、mapboth_002.pdf、mapboth_003.pdf... (新しい pdf ファイル (mapboth) に入れる必要はありません。map1 に追加しても問題ありません)

各 map1_ *.pdf ディレクトリを調べて、ファイル名の数字 (* がある場所) が一致する場所に map2_ *.pdf を追加します。

Pythonを使用してそれを行う方法が必要です。たぶん、arcpy、os.walk または os.listdir、および pyPdf と for ループの組み合わせでしょうか?

os.walk(datadirectory) の pdf の場合:

      ??

何か案は?ご協力いただきありがとうございます。

4

4 に答える 4

1

PDFファイルは、プレーンテキストファイルとは異なる方法で構造化されています。2つのPDFファイルをまとめるだけでは、ファイルの構造と内容が上書きされたり破損したりする可能性があるため、機能しません。確かに自分で作成することもできますが、それにはかなりの時間がかかり、PDFが内部でどのように構造化されているかについての深い知識が必要になります。

そうは言っても、pyPDFを調べることをお勧めします。それはあなたが探しているマージ機能をサポートします。

于 2012-06-05T23:42:23.070 に答える
1

これにより、マージするすべてのファイルが適切に検索および照合されます。実際の .pdf マージ コードが必要です。

編集: pyPdf example codeに基づいて pdf 書き込みコードを追加しました。テストされていませんが、(私が知る限り) 正しく動作するはずです。

Edit2:マップ番号の交差があることに気付きました。マップの正しいセットをマージするために再調整しました。

import collections
import glob
import re

# probably need to install this module -
#   pip install pyPdf
from pyPdf import PdfFileWriter, PdfFileReader

def group_matched_files(filespec, reg, keyFn, dataFn):
    res = collections.defaultdict(list)
    reg = re.compile(reg)
    for fname in glob.glob(filespec):
        data = reg.match(fname)
        if data is not None:
            res[keyFn(data)].append(dataFn(data))
    return res

def merge_pdfs(fnames, newname):
    print("Merging {} to {}".format(",".join(fnames), newname))

    # create new output pdf
    newpdf = PdfFileWriter()

    # for each file to merge
    for fname in fnames:
        with open(fname, "rb") as inf:
            oldpdf = PdfFileReader(inf)
            # for each page in the file
            for pg in range(oldpdf.getNumPages()):
                # copy it to the output file
                newpdf.addPage(oldpdf.getPage(pg))

    # write finished output
    with open(newname, "wb") as outf:
        newpdf.write(outf)

def main():
    matches = group_matched_files(
        "map*.pdf",
        "map(\d+)_(\d+).pdf$",
        lambda d: "{}".format(d.group(2)),
        lambda d: "map{}_".format(d.group(1))
    )
    for map,pages in matches.iteritems():
        merge_pdfs((page+map+'.pdf' for page in sorted(pages)), "merged{}.pdf".format(map))

if __name__=="__main__":
    main()
于 2012-06-05T23:57:38.563 に答える
0

試して組み合わせるテストPDFはありませんが、テキストファイルに対してcatコマンドを使用してテストしました。あなたはこれを試すことができます(私はunixベースのシステムを想定しています):merge.py

import os, re
files = os.listdir("/home/user/directory_with_maps/")
files = [x for x in files if re.search("map1_", x)]
while len(files) > 0:
    current = files[0]
    search = re.search("_(\d+).pdf", current)
    if search:
        name = search.group(1)
        cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=FULLMAP_%s.pdf %s map2_%s.pdf" % (name, current, name)
        os.system(cmd)
    files.remove(current)

基本的に、maps1リストを調べて取得し、次に正しいファイルを調べて、番号を調べます。(これを行うためにカウンターを使用し、同様の効果を得るために0でパディングすることがわかります)。

最初にgsコマンドをテストしますが、 http://hints.macworld.com/article.php?story= 2003083122212228から取得しました。

于 2012-06-05T23:37:32.240 に答える