답변:
나는 이것이 오래된 게시물이라는 것을 알고 있지만 해결책을 찾기 위해 오랜 시간을 보냈습니다. ReportLab과 PyPDF 만 사용하여 괜찮은 것을 발견 했으므로 공유 할 것이라고 생각했습니다.
PdfFileReader()
이 입력을PdfFileReader()
, 우리는이 전화 할게 텍스트를PdfFileWriter()
이 출력을.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)
여기에서 입력 파일의 페이지를 다른 문서와 병합 할 수 있습니다.
from pyPdf import PdfFileWriter, PdfFileReader
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(10, 100, "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(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()
from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
packet = io.BytesIO()
# create a new PDF with Reportlab
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)
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.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()
io.BytesIO
pyPDF (유지 관리되지 않음)가 아닌 PyPDF2 여야합니다. 좋은 대답입니다!
open
대신 file
.
existing_pdf
로 output
, 샘플 코드는하지 않습니다.
pdfrw 를 사용하면 기존 PDF에서 페이지를 읽고이를 reportlab 캔버스에 그릴 수 있습니다 (이미지 그리기와 유사). github 의 pdfrw examples / rl1 하위 디렉토리에 이에 대한 예제가 있습니다 . 면책 조항 : 저는 pdfrw 작성자입니다.
위 의 David Dehghan 의 답변을 활용 하면 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()
cpdf 는 명령 줄에서 작업을 수행합니다. 하지만 파이썬은 아닙니다 (afaik) :
cpdf -add-text "Line of text" input.pdf -o output .pdf
문제를 해결하여 PDF를 편집 가능한 형식으로 변환하고 변경 사항을 작성한 다음 다시 PDF로 변환하는 것이 더 좋을 수 있습니다. PDF를 직접 편집 할 수있는 라이브러리는 모르지만 예를 들어 DOC와 PDF 사이에는 많은 변환기가 있습니다.
Windows를 사용하는 경우 다음과 같이 작동 할 수 있습니다.
Python의 PDF 생성 및 편집 프레임 워크에 대한 백서도 있습니다. 약간 날짜가 있지만 유용한 정보를 제공 할 수 있습니다.