Как я могу добавить собственный шрифт в существующий файл PDF?

У меня есть файл шрифта "myfont.otf". И у меня есть pdf файл "target.pdf". Я хочу добавить файл шрифта в файл PDF. Я пытаюсь спросить

Код выглядит следующим образом:

from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from fpdf import FPDF
from reportlab.lib.pagesizes import letter

packet = io.BytesIO()
pdf = FPDF()
pdf.add_page()

pdf.add_font('myfont', '', 'myfont.otf', uni=True)

pdf.set_font('myfont', '', 12)

pdf.text(10, 10, "Hello, world!")

pdf.output(packet, 'F')
packet.seek(0)

new_pdf = PdfFileReader(packet)

existing_pdf = PdfFileReader(open("target.pdf", "rb"))
output = PdfFileWriter()

page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)

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

Но этот код работает некорректно.

Я использую последнюю версию pypdf и fpdf2.

Если бы вы использовали PyMuPDF, я бы смог помочь.

Jorj McKie 13.04.2023 12:30

@JorjMcKie Спасибо. Можете ли вы рассказать мне, как это делает модуль pymupdf?

HaituN 14.04.2023 03:08

@KJ Спасибо. Когда я использую Adobe Acrobat, я могу вставить Source Han Sans.otf в файл PDF, в котором отсутствует шрифт. Но у меня слишком много pdf-файлов, поэтому я хочу иметь скрипт python для решения этой задачи.

HaituN 14.04.2023 03:15

@KJ Спасибо! Моя версия файла PDF 1.6+. Теперь я пытаюсь использовать PyMuPDF для решения проблемы.

HaituN 17.04.2023 03:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как добавить собственный шрифт в PDF с помощью PyMuPDF.

import fitz  # PyMuDPDF
myfont = "myfont.otf"

doc = fitz.open("input.pdf")
page = doc[pno]  # load page with number pno (0-based)
page.insert_font(fontname = "F0", fontfile=myfont)

# now start inserting text on the page. Use insertion point (100,100) at first
page.insert_text((100,100), "Hello world", fontname = "F0", fontsize=14, ...)

# some text in a box
rect = fitz.Rect(100, 120, 300, 200)  # a rectangle
page.insert_textbox(rect, "this is text in a rectangle with auto line breaks",
    fontname = "F0", ...)
# etc.

# Before saving, optionally build a subset of myfont:
doc.subset_fonts()
doc.save("output.pdf", garbage=4, deflate=True)

Другие вопросы по теме