pypdf icon indicating copy to clipboard operation
pypdf copied to clipboard

FreeText annotation not showing in chrome browser

Open 123woscc opened this issue 6 months ago • 7 comments

I added a FreeText annotation to a PDF, but noticed that it's not shown in some PDF viewers.

The input PDF seems not to matter.

Environment

  • Windows-10-10.0.22000-SP0
  • pypdf 3.17.4
  • pypdf==3.17.4, crypt_provider=('local_crypt_fallback', '0.0.0'), PIL=8.4.0

Code + PDF

input.pdf

from pypdf import PdfReader, PdfWriter
from pypdf.annotations import FreeText

# Fill the writer with the pages you want
pdf_path = 'input.pdf'
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)

# Create the annotation and add it
annotation = FreeText(
    text="Hello World\nThis is the second line!",
    rect=(50, 550, 200, 650),
    font="Arial",
    bold=True,
    italic=True,
    font_size="20pt",
    font_color="00ff00",
    border_color="0000ff",
    background_color="cdcdcd",
)
writer.add_annotation(page_number=0, annotation=annotation)

# Write the annotated file to disk
with open("output.pdf", "wb") as fp:
    writer.write(fp)

output.pdf

Screenshots

The added comments are not displayed

output.pdf in firefox image

output.pdf in chrome image

123woscc avatar Dec 27 '23 09:12 123woscc

I can confirm that I see the annotation in Evince, but not in the Google Chrome viewer (also with a different input.pdf)

MartinThoma avatar Dec 28 '23 07:12 MartinThoma

Thanks for sharing!

MartinThoma avatar Dec 28 '23 07:12 MartinThoma

This might be related to #2332. Did this work correctly in PyPDF2?

stefan6419846 avatar Dec 28 '23 08:12 stefan6419846

from pypdf import PdfReader, PdfWriter
from pypdf.annotations import FreeText

# Fill the writer with the pages you want
pdf_path = 'input.pdf'
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)

You should try to append the page :

pdf_path = 'input.pdf'
reader = PdfReader(pdf_path)
writer = PdfWriter()
writer.append(reader,[0])

is it better ?

pubpub-zz avatar Dec 28 '23 09:12 pubpub-zz

Using append causes the same problems:

from pypdf import PdfReader, PdfWriter
from pypdf.annotations import FreeText

# Fill the writer with the pages you want
pdf_path = 'input.pdf'
reader = PdfReader(pdf_path)
writer = PdfWriter()
writer.append(reader, [0])

# Create the annotation and add it
annotation = FreeText(
    text="Hello World\nThis is the second line!",
    rect=(50, 550, 200, 650),
    font="Arial",
    bold=True,
    italic=True,
    font_size="20pt",
    font_color="00ff00",
    border_color="0000ff",
    background_color="cdcdcd",
)
writer.add_annotation(page_number=0, annotation=annotation)


writer.create_viewer_preferences()

# Write the annotated file to disk
with open("output.pdf", "wb") as fp:
    writer.write(fp)

MartinThoma avatar Dec 28 '23 17:12 MartinThoma

@stefan6419846 It was also broken in PyPDF2:

from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import AnnotationBuilder

# Fill the writer with the pages you want
pdf_path = 'input.pdf'
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)

# Create the annotation and add it
annotation = AnnotationBuilder.free_text(
    text="Hello World\nThis is the second line!",
    rect=(50, 550, 200, 650),
    font="Arial",
    bold=True,
    italic=True,
    font_size="20pt",
    font_color="00ff00",
    border_color="0000ff",
    background_color="cdcdcd",
)
writer.add_annotation(page_number=0, annotation=annotation)

# Write the annotated file to disk
with open("output-pypdf2.pdf", "wb") as fp:
    writer.write(fp)

MartinThoma avatar Dec 28 '23 17:12 MartinThoma