在字典键(或csv)中附加基于pdf文件的multilpe值会导致页面过多

2024-04-26 00:21:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试生成pdf文件的基础上,他们属于县。如果每个县有多个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不喜欢使用groupby的概念遍历和创建文件。我想这和它存储记忆的方式有关。结果是在遍历键值时创建的页面数量越来越多。我花了好几天时间想这是我的代码。很高兴知道这不是我的猜测,但我很惊讶这条信息不是“在网上”更好。你知道吗

我的解决方案是使用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)

Tags: 文件importpdf地图mergedfilenamemapscounty
1条回答
网友
1楼 · 发布于 2024-04-26 00:21:48

我的数据最初是一个csv文件,下面的代码引用了它,而不是我在上面的示例中使用的字典(它是从csv文件生成的),但是您应该能够根据下面的代码收集到我所做的事情。我基本上是从字典的角度出发,逐行读取csv文件,然后使用arcpy进行追加。当试图基于一个键输出多个文件时,pyPDF2不能正确地合并。我生命中的三天都回不来了

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

相关问题 更多 >