2017-09-13 26 views
0

我想根據他們所在的縣來生成pdf文件。如果每個縣有多個pdf文件,那麼我需要根據縣域密鑰將文件附加到單個文件中。我似乎無法獲得基於密鑰追加的地圖。生成的最終地圖看起來是隨機的,往往會附加太多的文件。我很確定我沒有正確分組它們。我已經讀過一個鍵中的多個值可能導致多次顯示。有人可以告訴我如何分別訪問每個鍵的每個值,只有一次?很顯然,我不瞭解某些至關重要的事情。在字典鍵(或csv)中添加基於pdf文件的多字節值會導致頁面太多

我的代碼:

import csv, os 
import shutil 
from PyPDF2 import PdfFileMerger, PdfFileReader, PdfFileWriter 

merged_file = PdfFileMerger() 
counties = {'County4': ['C:\\maps\\map2.pdf', 'C:\\maps\\map3.pdf', 'C:\\maps\\map4.pdf'], 'County1': ['C:\\maps\\map1.pdf', 'C:\\maps\\map2.pdf'], 'County3': ['C:\\maps\\map3.pdf'], 'County2': ['C:\\maps\\map1.pdf', 'C:\\maps\\map3.pdf']} 
for k, v in counties.items(): 
    newPdfFile = ('C:\maps\JoinedMaps\k +'.pdf') 
    if len(v) > 1: 
     for filename in v: 
      merged_file.append(PdfFileReader(filename,'rb')) 
     merged_file.write(newPdfFile) 
    else: 
     for filename in v: 
      shutil.copyfile(filename, newPdfFile) 

我得到的輸出四張地圖(這是正確的),但在某些文件的「頁面」(附加文件)的數量是大錯特錯了。據我所知,這些頁面如何被追加沒有押韻或理由。 County4 PDF有3頁(正確),County1 PDF具有8頁,而不是2,County3 PDF具有1頁(正確的)和County2具有15頁,而不是2.

編輯:

原來pyPDF2確實不像使用group-by的概念迭代和創建文件。我想它對於存儲內存的方式有些不同。結果是在迭代關鍵值時創建越來越多的頁面。我花了幾天的時間認爲這是我的編碼。很高興知道這不是我猜想的,但我很驚訝這部分信息並非「在互聯網上」更好。

我的解決方案是使用arcpy,它不會幫助大多數用戶閱讀此內容,遺憾地說。

對於那些希望在我的解決方案,我的csv文件是這樣的:

County1 C:\maps\map1.pdf 
County1 C:\maps\map2.pdf 
County2 C:\maps\map1.pdf 
County2 C:\maps\map3.pdf 
County3 C:\maps\map3.pdf 
County4 C:\maps\map2.pdf 
County4 C:\maps\map3.pdf 
County4 C:\maps\map4.pdf 

和我得到的PDF文件是這樣的:

County-County1 (2 pages - Map1 and Map2) 
County-County2 (2 pages - Map1 and Map3) 
County-County3 (1 page - Map3) 
County-County2 (3 pages - Map2, Map3, and Map4) 
+0

我假設:' 'C:\地圖\ JoinedMaps \ K +' pdf''應該是''C:\地圖\ JoinedMaps \ {} '.format(k)+'。pdf'' - 如果是這樣,那麼這是一個簡單的語法錯誤... – coder

+0

不幸的是結果是一樣的。 – NewbieX

回答

0

我的數據開始作爲一個CSV文件,下面的代碼引用了這個,而不是我在上面的例子中使用的詞典(它是從csv文件生成的),但是你應該能夠根據下面的代碼收集我所做的。我基本上已經刮掉了字典的想法,然後逐行閱讀csv文件,然後使用arcpy進行添加。 pyPDF2 does NOT正確合併時試圖輸出多個文件基於一個關鍵。我生命中的三天,我不能回來

import csv 
import arcpy 
from arcpy import env 
import shutil, os, glob 

# clear out files from destination directory 
files = glob.glob(r'C:\maps\JoinedMaps\*') 
for f in files: 
    os.remove(f) 

# open csv file 
f = open("C:\maps\Maps.csv", "r+") 
ff = csv.reader(f) 

# set variable to establish previous row of csv file (for comaprrison) 
pre_line = ff.next() 

# Iterate through csv file 

for cur_line in ff: 
    # new file name and location based on value in column (county name) 
    newPdfFile = (r'C:\maps\JoinedMaps\County-' + cur_line[0] +'.pdf') 
    # establish pdf files to be appended 
    joinFile = pre_line[1] 
    appendFile = cur_line[1] 

    # If columns in both rows match 
    if pre_line[0] == cur_line[0]: # <-- compare first column 
     # If destnation file already exists, append file referenced in current row 
     if os.path.exists(newPdfFile): 
      tempPdfDoc = arcpy.mapping.PDFDocumentOpen(newPdfFile) 
      tempPdfDoc.appendPages(appendFile) 
     # Otherwise create destination and append files reference in both the previous and current row 
     else: 
      tempPdfDoc = arcpy.mapping.PDFDocumentCreate(newPdfFile) 
      tempPdfDoc.appendPages(joinFile) 
      tempPdfDoc.appendPages(appendFile) 
     # save and delete temp file 
     tempPdfDoc.saveAndClose() 
     del tempPdfDoc 
    else: 
     # if no match, do not merge, just copy 
     shutil.copyfile(appendFile,newPdfFile) 

    # reset variable 
    pre_line = cur_line