programing

Python을 사용하여 기존 PDF에 텍스트 추가

closeapi 2023. 7. 20. 21:58
반응형

Python을 사용하여 기존 PDF에 텍스트 추가

파이썬을 사용하여 기존 PDF에 추가 텍스트를 추가해야 하는데, 이 작업을 수행하는 가장 좋은 방법은 무엇이며 추가 모듈을 설치해야 합니다.

참고: 이상적으로 Windows와 Linux 모두에서 이 기능을 실행할 수 있으면 좋겠지만, 누르면 Linux만 실행할 수 있습니다.

편집: pypdfReportLab은 좋아 보이지만 둘 다 기존 PDF를 편집할 수 없습니다. 다른 옵션이 있습니까?

[Python 2.7]의 예:

from pyPdf import PdfFileWriter, PdfFileReader
import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)

# create a new PDF with Reportlab
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(file("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = file("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

Python 3.x의 예:


from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)

# create a new PDF with Reportlab
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(open("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.pages[0]
page.merge_page(new_pdf.pages[0])
output.add_page(page)
# finally, write "output" to a real file
output_stream = open("destination.pdf", "wb")
output.write(output_stream)
output_stream.close()

오래된 직책인 건 알지만 해결책을 찾기 위해 오랜 시간을 보냈습니다.ReportLab과 PyPDF만 사용하는 괜찮은 제품을 발견했기 때문에 다음을 공유하려고 했습니다.

  1. 사용하여 PDF 읽기PdfFileReader()우리는 이 입력을 호출할 것입니다.
  2. ReportLab을 사용하여 추가할 텍스트가 포함된 새 PDF를 만들고, 이를 문자열 개체로 저장합니다.
  3. 사용하여 문자열 개체 읽기PdfFileReader()우리는 이 문자를 부를 것입니다.
  4. 사용하여 새 PDF 개체 생성PdfFileWriter()우리는 이 출력을 호출할 것입니다.
  5. 입력 및 적용을 통해 반복합니다..mergePage(*text*.getPage(0))텍스트를 추가할 각 페이지에 대해 다음을 사용합니다.output.addPage()수정된 페이지를 새 문서에 추가하려면

이것은 간단한 텍스트 추가에 적합합니다.문서에 워터마크를 표시하는 방법은 PyPDF의 샘플을 참조하십시오.

다음은 아래 질문에 대답할 몇 가지 코드입니다.

packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
<do something with canvas>
can.save()
packet.seek(0)
input = PdfFileReader(packet)

여기서 입력 파일의 페이지를 다른 문서와 병합할 수 있습니다.

pdfrw를 사용하면 기존 PDF에서 페이지를 읽고 보고서 랩 캔버스에 그릴 수 있습니다(이미지 그리기와 유사).github의 pdfrw example/rl1 하위 디렉터리에는 이에 대한 예가 있습니다.고지 사항:저는 pdfrw 작가입니다.

cpdf는 명령줄에서 작업을 수행합니다.하지만 파이썬은 아닙니다. (afaik):

cpdf -add-text "Line of text" input.pdf -o output .pdf

위의 David Deghan답변활용하여 다음은 Python 2.7.13에서 작동합니다.

from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger

import StringIO

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = StringIO.StringIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(290, 720, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader("original.pdf")
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

PyPDF2는 PdfFileReader, PdfFileWriter 및 기타 몇 가지 메서드를 평가절하하고 다른 이름과 메서드로 변경했으며 getPage()와 같은 메서드도 PdfReader의 속성으로 직접 변경했습니다.

다음은 기존 PDF 파일에 텍스트를 추가할 수 있는 매우 간단한 클래스입니다. (마지막에 사용법이 시연됩니다.)

from PyPDF2 import PdfWriter, PdfReader, Transformation
import io
from reportlab.pdfgen.canvas import Canvas

class GenerateFromTemplate:
    def __init__(self,template):
        self.template_pdf = PdfReader(open(template, "rb"))
        self.template_page= self.template_pdf.pages[0]

        self.packet = io.BytesIO()
        self.c = Canvas(self.packet,pagesize=(self.template_page.mediabox.width,self.template_page.mediabox.height))

    
    def addText(self,text,point):
        self.c.drawString(point[0],point[1],text)

    def merge(self):
        self.c.save()
        self.packet.seek(0)
        result_pdf = PdfReader(self.packet)
        result = result_pdf.pages[0]

        self.output = PdfWriter()

        op = Transformation().rotate(0).translate(tx=0, ty=0)
        result.add_transformation(op)
        self.template_page.merge_page(result)
        self.output.add_page(self.template_page)
    
    def generate(self,dest):
        outputStream = open(dest,"wb")
        self.output.write(outputStream)
        outputStream.close()

"""
Use as:
gen = GenerateFromTemplate("template.pdf")
gen.addText("Hello!",(100,200))
gen.addText("PDF!",(100,300))
gen.merge()
gen.generate("Output.pdf")
"""

이게 도움이 되길 바랍니다.

mergePage를 사용하지 않습니다. 일부 pdfs에서 작동하지 않을 수 있습니다. mergeRotatedTranslatedPage를 사용해야 합니다.

from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen.canvas import Canvas

page_to_merge = 0 #Refers to the First page of PDF 
xcoor = 250 #To be changed according to your pdf
ycoor = 650 #To be changed according to your pdf

input_pdf = PdfFileReader(open("Source.pdf", "rb"))
page_count = input_pdf.getNumPages()
inputpdf_page_to_be_merged = input_pdf.getPage(page_to_merge)

packet = io.BytesIO()
c = Canvas(packet,pagesize=(inputpdf_page_to_be_merged.mediaBox.getWidth(),inputpdf_page_to_be_merged.mediaBox.getHeight()))
c.drawString(xcoor,ycoor,"Hello World")
c.save()
packet.seek(0)

overlay_pdf = PdfFileReader(packet)
overlay = overlay_pdf.getPage(0)

output = PdfFileWriter()

for PAGE in range(page_count):
    if PAGE == page_to_merge:
        inputpdf_page_to_be_merged.mergeRotatedTranslatedPage(overlay, 
                inputpdf_page_to_be_merged.get('/Rotate') or 0, 
                overlay.mediaBox.getWidth()/2, overlay.mediaBox.getWidth()/2)
        output.addPage(inputpdf_page_to_be_merged)
    
    else:
        Page_in_pdf = input_pdf.getPage(PAGE)
        output.addPage(Page_in_pdf)

outputStream = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

Windows(윈도우)를 사용하는 경우 다음과 같이 작동할 수 있습니다.

PDF Creator 파일럿

Python의 PDF 생성 및 편집 프레임워크에 대한 백서도 있습니다.약간 오래되었지만 유용한 정보를 제공할 수 있습니다.

PDF 편집 및 처리 프레임워크로 Python 사용

문제를 PDF를 편집 가능한 형식으로 변환하고 변경 사항을 작성한 다음 PDF로 다시 변환하는 것이 더 좋은 운이 될 수 있습니다.PDF를 직접 편집할 수 있는 라이브러리는 모르겠지만 예를 들어 DOC와 PDF 간 변환기가 많습니다.

언급URL : https://stackoverflow.com/questions/1180115/add-text-to-existing-pdf-using-python

반응형