# v0

## v0.10.2

### Fixes

- Fixed segfault when overwriting the pikepdf file that is currently
  open on Linux.
- Fixed removal of an attribute metadata value when values were present
  on the same node.

## v0.10.1

(fixes-1)=

### Fixes

- Avoid canonical XML since it is apparently too strict for XMP.

## v0.10.0

(fixes-2-1)=

### Fixes

- Fixed several issues related to generating XMP metadata that passed
  veraPDF validation.
- Fixed a random test suite failure for very large negative integers.
- The lxml library is now required.

## v0.9.2

(fixes-3-1)=

### Fixes

- Added all of the commonly used XML namespaces to XMP metadata
  handling, so we are less likely to name something 'ns1', etc.
- Skip a test that fails on Windows.
- Fixed build errors in documentation.

## v0.9.1

(fixes-4-1)=

### Fixes

- Fix `Object.write()` accepting positional arguments it wouldn't use
- Fix handling of XMP data with timezones (or missing timezone
  information) in a few cases
- Fix generation of XMP with invalid XML characters if the invalid
  characters were inside a non-scalar object

## v0.9.0

### Updates

- New API to access and edit PDF metadata and make consistent edits to
  the new and old style of PDF metadata.
- 32-bit binary wheels are now available for Windows
- PDFs can now be saved in QPDF's "qdf" mode
- The Python package defusedxml is now required
- The Python package python-xmp-toolkit and its dependency libexempi
  are suggested for testing, but not required

(fixes-5-1)=

### Fixes

- Fixed handling of filenames that contain multibyte characters on
  non-UTF-8 systems

### Breaking

- The `Pdf.metadata` property was removed, and replaced with the new
  metadata API
- `Pdf.attach()` has been removed, because the interface as
  implemented had no way to deal with existing attachments.

## v0.3.7

- Add API for inline images to unparse themselves

## v0.3.6

- Performance of reading files from memory improved to avoid
  unnecessary copies.
- It is finally possible to use `for key in pdfobj` to iterate
  contents of PDF Dictionary, Stream and Array objects. Generally these
  objects behave more like Python containers should now.
- Package API declared beta.

## v0.3.5

(breaking-1)=

### Breaking

- `Pdf.save(...stream_data_mode=...)` has been dropped in favor of
  the newer `compress_streams=` and `stream_decode_level`
  parameters.

(fixes-6-1)=

### Fixes

- A use-after-free memory error that caused occasional segfaults and
  "QPDFFakeName" errors when opening from stream objects has been
  resolved.

## v0.3.4

(updates-1)=

### Updates

- pybind11 vendoring has ended now that v2.2.4 has been released

## v0.3.3

(breaking-2-1)=

### Breaking

- libqpdf 8.2.1 is now required

(updates-2-1)=

### Updates

- Improved support for working with JPEG2000 images in PDFs
- Added progress callback for saving files,
  `Pdf.save(..., progress=)`
- Updated pybind11 subtree

(fixes-7-1)=

### Fixes

- `del obj.AttributeName` was not implemented. The attribute
  interface is now consistent
- Deleting named attributes now defers to the attribute dictionary for
  Stream objects, as get/set do
- Fixed handling of JPEG2000 images where metadata must be retrieved
  from the file

## v0.3.2

(updates-3-1)=

### Updates

- Added support for direct image extraction of CMYK and grayscale
  JPEGs, where previously only RGB (internally YUV) was supported
- `Array()` now creates an empty array properly
- The syntax `Name.Foo in Dictionary()`, e.g.
  `Name.XObject in page.Resources`, now works

## v0.3.1

(breaking-3-1)=

### Breaking

- `pikepdf.open` now validates its keyword arguments properly,
  potentially breaking code that passed invalid arguments
- libqpdf 8.1.0 is now required - libqpdf 8.1.0 API is now used for
  creating Unicode strings
- If a non-existent file is opened with `pikepdf.open`, a
  `FileNotFoundError` is raised instead of a generic error
- We are now *temporarily* vendoring a copy of pybind11 since its
  main branch contains unreleased and important fixes for Python 3.7.

(updates-4-1)=

### Updates

- The syntax `Name.Thing` (e.g. `Name.DecodeParms`) is now
  supported as equivalent to `Name('/Thing')` and is the recommended
  way to refer names within a PDF
- New API `Pdf.remove_unneeded_resources()` which removes objects
  from each page's resource dictionary that are not used in the page.
  This can be used to create smaller files.

(fixes-8-1)=

### Fixes

- Fixed an error parsing inline images that have masks
- Fixed several instances of catching C++ exceptions by value instead
  of by reference

## v0.3.0

(breaking-4-1)=

### Breaking

- Modified `Object.write` method signature to require `filter` and
  `decode_parms` as keyword arguments
- Implement automatic type conversion from the PDF Null type to
  `None`
- Removed `Object.unparse_resolved` in favor of
  `Object.unparse(resolved=True)`
- libqpdf 8.0.2 is now required at minimum

(updates-5-1)=

### Updates

- Improved IPython/Jupyter interface to directly export temporary PDFs
- Updated to qpdf 8.1.0 in wheels
- Added Python 3.7 support for Windows
- Added a number of missing options from QPDF to `Pdf.open` and
  `Pdf.save`
- Added ability to delete a slice of pages
- Began using Jupyter notebooks for documentation

## v0.2.2

- Added Python 3.7 support to build and test (not yet available for
  Windows, due to lack of availability on Appveyor)
- Removed setter API from `PdfImage` because it never worked anyway
- Improved handling of `PdfImage` with trivial palettes

## v0.2.1

- `Object.check_owner` renamed to `Object.is_owned_by`
- `Object.objgen` and `Object.get_object_id` are now public
  functions
- Major internal reorganization with `pikepdf.models` becoming the
  submodule that holds support code to ease access to PDF objects as
  opposed to wrapping QPDF.

## v0.2.0

- Implemented automatic type conversion for `int`, `bool` and
  `Decimal`, eliminating the `pikepdf.{Integer,Boolean,Real}`
  types. Removed a lot of associated numerical code.

Everything before v0.2.0 can be considered too old to document.
