假设您有一个pdf页面,其中包含各种复杂元素。 目的是裁剪页面的某个区域(仅提取其中一个元素),然后将其粘贴到另一个pdf页面中。
这是我的代码的简化版本:
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文件。 问题在于,当我尝试将树粘贴到新页面中时,无论如何都会粘贴原始图像的星星和房子
答案 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'))
也许有更好的方法可以插入该代码,而无需直接编辑源代码。如果有人找到一种方法,我将不胜感激,因为这无疑是一个有点狡猾的黑客。