Python + PyPdf:裁剪页面区域并将其粘贴到另一个页面中

时间:2019-02-26 15:21:20

标签: python merge pdf-generation pypdf2 pypdf

假设您有一个pdf页面,其中包含各种复杂元素。 目的是裁剪页面的某个区域(仅提取其中一个元素),然后将其粘贴到另一个pdf页面中。

example

这是我的代码的简化版本:

import PyPDF2
import PyPdf

def extract_tree(in_file, out_file):
    with open(in_file, 'rb') as infp:
        # Read the document that contains the tree (in its first page)
        reader = pyPdf.PdfFileReader(infp)
        page = reader.getPage(0)

        # Crop the tree. Coordinates below are only referential
        page.cropBox.lowerLeft = [100,200]
        page.cropBox.upperRight = [250,300]

        # Create an empty document and add a single page containing only the cropped page
        writer = pyPdf.PdfFileWriter()
        writer.addPage(page)
        with open(out_file, 'wb') as outfp:
            writer.write(outfp)

def insert_tree_into_page(tree_document, text_document):
    # Load the first page of the document containing 'text text text text...'
    text_page = PyPDF2.PdfFileReader(file(text_document,'rb')).getPage(0)

    # Load the previously cropped tree (cropped using 'extract_tree')
    tree_page = PyPDF2.PdfFileReader(file(tree_document,'rb')).getPage(0)

    # Overlay the text-page and the tree-crop   
    text_page.mergeScaledTranslatedPage(page2=tree_page,scale='1.0',tx='100',ty='200')

    # Save the result into a new empty document
    output = PyPDF2.PdfFileWriter()
    output.addPage(text_page)
    outputStream = file('merged_document.pdf','wb')
    output.write(outputStream)



# First, crop the tree and save it into cropped_document.pdf
extract_tree('document1.pdf', 'cropped_document.pdf')

# Now merge document2.pdf with cropped_document.pdf
insert_tree_into_page('cropped_document.pdf', 'document2.pdf')

方法“ extract_tree”似乎正在工作。它将生成仅包含裁剪区域(在示例中为树)的pdf文件。 问题在于,当我尝试将树粘贴到新页面中时,无论如何都会粘贴原始图像的星星和房子

2 个答案:

答案 0 :(得分:0)

我尝试了一些切实可行的方法。尝试将您的第一个输出(仅包含树的pdf)转换为docx,然后再将其从docx转换为pdf,然后再将其与其他pdf页面合并。它将起作用(仅将树合并)。

请允许我问,您如何实现定义农作物Au界限的接口。

答案 1 :(得分:0)

我遇到了完全相同的问题。最后,我的解决方案是对 pyPDF2 的源代码(来自 this pull request,从未进入主分支)进行小的编辑。您需要做的是将这些行插入文件 _mergePage 中类 PageObject 的方法 pdf.py 中:

page2Content = ContentStream(page2Content, self.pdf)
page2Content.operations.insert(0, [map(FloatObject, [page2.trimBox.getLowerLeft_x(), page2.trimBox.getLowerLeft_y(), page2.trimBox.getWidth(), page2.trimBox.getHeight()]), "re"])
page2Content.operations.insert(1, [[], "W"])
page2Content.operations.insert(2, [[], "n"])

(请参阅拉取请求以了解将它们放在哪里)。完成后,您可以裁剪您想要的 pdf 部分,并将其与另一个页面合并,没有问题。除非您愿意,否则无需将裁剪后的部分保存为单独的 pdf。

from PyPDF2 import PdfFileReader, PdfFileWriter

tree_page = PdfFileReader(open('document1.pdf','rb')).getPage(0)
text_page = PdfFileReader(open('document2.pdf','rb')).getPage(0)

tree_page.cropBox.lowerLeft = [100,200]
tree_page.cropBox.upperRight = [250, 300]

text_page.mergeScaledTranslatedPage(page2=tree_page, scale='1.0', tx='100', ty='200')
output = PdfFileWriter()
output.addPage(text_page)
output.write(open('merged_document.pdf', 'wb'))

也许有更好的方法可以插入该代码,而无需直接编辑源代码。如果有人找到一种方法,我将不胜感激,因为这无疑是一个有点狡猾的黑客。