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


106

Python을 사용하여 기존 PDF에 추가 텍스트를 추가해야합니다.이 문제를 해결하는 가장 좋은 방법은 무엇이며 어떤 추가 모듈을 설치해야할까요?

참고 : 이상적으로는 Windows와 Linux 모두에서 실행할 수 있기를 원하지만 푸시에서는 Linux 만 실행할 수 있습니다.

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

답변:


88

나는 이것이 오래된 게시물이라는 것을 알고 있지만 해결책을 찾기 위해 오랜 시간을 보냈습니다. 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)

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


2
"ReportLab을 사용하여 추가 할 텍스트가 포함 된 새 pdf를 만들고, 이것을 문자열 개체로 저장합니다."어떻게 수행합니까? 캔버스 인스턴스입니다.
Lakshman Prasad

1
Lakshman의 질문에 답하기 위해 위의 샘플 코드를 추가했습니다.
dwelch

더 업데이트되었으므로 PyPDF2를 사용하는 것이 좋습니다. 샘플 코드도 확인하십시오. github.com/mstamy2/PyPDF2/blob/…
blaze

2
이 코드는 새 pdf 파일을 만들고 모든 메타 데이터를 건너 뜁니다. 따라서 기존 pdf에 추가되지 않습니다.
Anton Kukoba 2018

124

[Python 2.7]의 예 :

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()

Python 3.x의 예 :


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()

13
python3의 경우 패킷은 io.BytesIOpyPDF (유지 관리되지 않음)가 아닌 PyPDF2 여야합니다. 좋은 대답입니다!
Noufal Ibrahim

4
공유해 주셔서 감사합니다. 잘 작동합니다. 한 참고 : 나는 그것을 사용하는 것이 좋습니다 생각 open대신 file.
mitenka 2016 년

특히 실제 예제가 포함되어 있기 때문에 이것이 더 수용 가능한 대답이라고 생각합니다.
Casey

1
주의 : 새 문서에는 원본의 첫 ​​페이지 만 포함됩니다! 그것은에서 페이지의 나머지 부분을 복사 할 쉽게 충분 existing_pdfoutput, 샘플 코드는하지 않습니다.
알렉시스

@alexis : pdf의 두 번째 페이지에 무언가를 넣도록 코드를 어떻게 수정 하시겠습니까? 두 페이지를 사용하는 양식이 있는데 첫 페이지에 갇혀 있습니다. 미리 감사드립니다.
DavidV

11

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


나는 당신이 거기에 링크를 넣을 수 있다고 생각
The6thSense

좋은 지적! 글을 올렸을 때 그렇게 많이하지 않았고 "최소한의 텍스트 플러스 링크 정책"이 걱정되었습니다. (내 담당자는 번에 46을, 그리고 나는 조금 : 5 살짜리 질문에 새로운 답변에 대해 걱정했다, 그래서 IIRC 난 그냥 한 대답에 -2받은
패트릭 Maupin을

오래된 질문은 더보기를 얻을 :)과 관심
The6thSense

FWIW, 이 링크를 따르기 시작하면 더 많은 reportlab / pdfrw 예제가 있습니다 . 나는 속임수 대상의 답변을 기반으로 거기에 대답했습니다.
Patrick Maupin

7

위 의 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()

3

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

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

0

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


1
문제는 PDF (타사)의 소스 만 가지고 있고 PDF-> DOC-> PDF가 변환에서 많이 손실된다는 것입니다. 또한 Linux에서 실행하려면 DOC가 최선의 선택이 아닐 수도 있습니다.
Frozenskys

Adobe는 더 나은 버전의 Acrobat에 대한 라이센스를 판매 할 수 있도록 PDF 편집 기능을 매우 비공개적이고 독점적으로 유지한다고 생각합니다. 일종의 매크로 인터페이스를 사용하여 Acrobat Pro의 사용을 자동화하여 편집하는 방법을 찾을 수 있습니다.
aehlke

작성하려는 부분이 양식 필드이면 편집 할 수있는 XML 인터페이스가 있습니다. 그렇지 않으면 아무것도 찾을 수 없습니다.
aehlke

아니요, 각 페이지에 몇 줄의 텍스트를 추가하고 싶었습니다.
Frozenskys


-4

pyPdf 를 사용해 보셨습니까 ?

죄송합니다. 페이지의 콘텐츠를 수정할 수 없습니다.


그게 효과가있는 것 같은데, 누군가 사용 했나요? 메모리 사용량은 어떻습니까?
Frozenskys

텍스트 워터 마크를 추가 할 수있는 기능이 있으며 제대로 포맷 된 경우 작동 할 수 있습니다.
Frozenskys
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.