Как изменить цвет границы и шрифта во встроенной текстовой/произвольной текстовой аннотации в документе PDF?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как изменить цвет границы и шрифта во встроенной текстовой/произвольной текстовой аннотации в документе PDF?

Сообщение Anonymous »

Я пишу скрипт Python для изменения цвета текста и границ встроенных аннотаций, вставленных с помощью okular в PDF-документ.
Этот скрипт вместо изменения только текста и границ кажется измененным вся аннотация красного цвета (вместо этого отображается полностью заполненный красный прямоугольник).
Поддерживается ли это вообще? Я понимаю, насколько сложен формат PDF, но надеялся, что это простое изменение не потребует ничего необычного.
пример встроенной текстовой аннотации в формате PDF, созданной okular:
11533 │ 229·13·obj␍␊
11534 │ ·stream␍␊
11535 │ q␊
11536 │ []·0·d␊
11537 │ 2.00·w␊
11538 │ 0.00000·0.00000·0.00000·RG␊
11539 │ 1.00·1.00·230.79·26.17·re␊
11540 │ 0.21569·0.18824·1.00000·rg␊
11541 │ B␊
11542 │ 4.00·4.00·224.79·20.17·re·W·n␊
11543 │ 0.00000·0.00000·0.00000·rg␊
11544 │ BT·1·0·0·1·4.00·24.17·Tm␊
11545 │ /popplerfont·10.00·Tf␊
11546 │ 0.00·-10.00·Td␊
11547 │ (\000e\000r\000g\000r\000g\000h\000r\000e\000h\000r\000h\000e\000h)·Tj␊
11548 │ ET·Q␊
11549 │ ␍␊
11550 │ endstream␍␊
11551 │ ␍␊
11552 │ endobj␍␊
11553 │ 230·0·obj␍␊
11554 │ ·␍␊
11555 │ endobj␍␊
11556 │ 231·0·obj␍␊
11557 │ ·stream␍␊
11558 │ q␊
11559 │ []·0·d␊
11560 │ 2.00·w␊
11561 │ 0.00000·0.00000·0.00000·RG␊
11562 │ 1.00·1.00·0.03·7.38·re␊
11563 │ 0.21569·0.18824·1.00000·rg␊
11564 │ B␊
11565 │ 4.00·4.00·-5.97·1.38·re·W·n␊
11566 │ 0.00000·0.00000·0.00000·rg␊
11567 │ BT·1·0·0·1·4.00·5.38·Tm␊
11568 │ /popplerfont·10.00·Tf␊
11569 │ 0.00·-10.00·Td␊
11570 │ ()·Tj␊
11571 │ ET·Q␊
11572 │ ␍␊
11573 │ endstream␍␊
11574 │ ␍␊
11575 │ endobj␍␊
11576 │ xref␍␊

и здесь конвертирован в формат qpdf:
40687 │ 0183013890·00000·n·␊
40688 │ 0185638157·00000·n·␊
40689 │ trailer·␊
40695 │ startxref␊
40696 │ 185638183␊
40697 │ %%EOF␊
40698 │ 1·0·obj␍␊
40699 │ ·␍␊
40700 │ endobj␍␊
40701 │ 4·0·obj␍␊
40702 │ ·␍␊
40703 │ endobj␍␊
40704 │ 372·0·obj␍␊
40705 │ ·␍␊
40706 │ endobj␍␊
40707 │ 373·0·obj␍␊
40708 │ ·␍␊
40709 │ endobj␍␊
40710 │ 374·0·obj␍␊
40711 │ ·stream␍␊

#!/usr/bin/env python3

import sys
import pikepdf
from pikepdf import Name
import re

def change_annotation_font_and_border_to_red(input_path):
output_path = input_path.replace(".pdf", "-output.pdf")

# Open the PDF file
with pikepdf.open(input_path) as pdf:
for page_number, page in enumerate(pdf.pages, start=1):
# Check if the page has annotations
if "/Annots" in page:
print(f"Page {page_number} contains annotations:")
# Iterate over each annotation in the /Annots array
for annot in page["/Annots"]:
print(f" - Annotation detected: {annot}")

# Set the border color to red (RGB)
annot[Name("/C")] = pikepdf.Array([1, 0, 0]) # RGB for red border

# Update the default appearance string (/DA) to set text color to red
if "/DA" in annot:
da_str = str(annot[Name("/DA")])
print(f" Original /DA: {da_str}")
# Remove any existing color settings in the DA string
da_str = re.sub(r"(\d+\.?\d*\s){1,3}[rg]", "", da_str)
# Append red color setting for text color
da_str = da_str.strip() + " 1 0 0 rg"
annot[Name("/DA")] = da_str
print(f" Updated /DA: {annot[Name('/DA')]}")

# Remove the appearance stream to apply changes if present
if "/AP" in annot:
del annot[Name("/AP")]
print(" Removed /AP to force appearance regeneration")

# Save the modified PDF with '-output.pdf' suffix
pdf.save(output_path)
print(f"Font and border color changed to red. Saved as: {output_path}")

if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python change_annotation_font_and_border_to_red.py ")
else:
input_path = sys.argv[1]
change_annotation_font_and_border_to_red(input_path)


Подробнее здесь: https://stackoverflow.com/questions/791 ... notation-i
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»