Skip to content

Access pdf annotations while inside pikepdf.Pdf context manager. #19824

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 30, 2021

Conversation

anntzer
Copy link
Contributor

@anntzer anntzer commented Mar 30, 2021

Depending on the exact way the pdf file is written, iterating over
Annots can fail after the file has been closed. This is not the case
for matplotlib-generated pdfs, but is the case for mplcairo-generated
ones. As a simple repro of the different behavior between
"in-the-contextmanager" and "out-of-the-contextmanager":

from matplotlib import pyplot as plt
plt.figtext(.5, .5, "hello, world", url="https://www.google.com")
plt.savefig("/tmp/test.pdf", backend="pdf")
import pikepdf
with pikepdf.Pdf.open("/tmp/test.pdf") as pdf:
    page = pdf.pages[0]
    print(repr(page.Annots)) # within contextmanager: ok
with pikepdf.Pdf.open("/tmp/test.pdf") as pdf:
    page = pdf.pages[0]
print(repr(page.Annots))  # after contextmanager: AttributeError

PR Summary

PR Checklist

  • Has pytest style unit tests (and pytest passes).
  • Is Flake 8 compliant (run flake8 on changed files to check).
  • New features are documented, with examples if plot related.
  • Documentation is sphinx and numpydoc compliant (the docs should build without error).
  • Conforms to Matplotlib style conventions (install flake8-docstrings and run flake8 --docstring-convention=all).
  • New features have an entry in doc/users/next_whats_new/ (follow instructions in README.rst there).
  • API changes documented in doc/api/next_api_changes/ (follow instructions in README.rst there).

Depending on the exact way the pdf file is written, iterating over
Annots can fail after the file has been closed.  This is not the case
for matplotlib-generated pdfs, but is the case for mplcairo-generated
ones.  As a simple repro of the different behavior between
"in-the-contextmanager" and "out-of-the-contextmanager":
```
from matplotlib import pyplot as plt
plt.figtext(.5, .5, "hello, world", url="https://www.google.com")
plt.savefig("/tmp/test.pdf", backend="pdf")
import pikepdf
with pikepdf.Pdf.open("/tmp/test.pdf") as pdf:
    page = pdf.pages[0]
    print(repr(page.Annots)) # within contextmanager: ok
with pikepdf.Pdf.open("/tmp/test.pdf") as pdf:
    page = pdf.pages[0]
print(repr(page.Annots))  # after contextmanager: AttributeError
```
@QuLogic QuLogic merged commit bba76b8 into matplotlib:master Mar 30, 2021
meeseeksmachine pushed a commit to meeseeksmachine/matplotlib that referenced this pull request Mar 30, 2021
@anntzer anntzer deleted the pikepdfannots branch March 30, 2021 21:39
QuLogic added a commit that referenced this pull request Mar 31, 2021
…824-on-v3.4.x

Backport PR #19824 on branch v3.4.x (Access pdf annotations while inside pikepdf.Pdf context manager.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants