-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChangeLog
4712 lines (3448 loc) · 185 KB
/
ChangeLog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
2023-12-16 Jay Berkenbilt <[email protected]>
* Add new C++ functions "qpdf_c_get_qpdf" and "qpdf_c_wrap" to
qpdf-c.h that make it possible to write your own extern "C"
functions in C++ that interoperate with the C API. See
examples/extend-c-api for more information.
2023-12-10 Jay Berkenbilt <[email protected]>
* 11.6.4: release
2023-12-09 Jay Berkenbilt <[email protected]>
* Install fix: include cmake files with the dev component.
2023-11-20 Jay Berkenbilt <[email protected]>
* Build AppImage with an older Linux distribution to support AWS
Lambda. Fixes #1086.
2023-10-15 Jay Berkenbilt <[email protected]>
* 11.6.3: release
2023-10-14 Jay Berkenbilt <[email protected]>
* Tweak linearization code to better handle files between 2 GB and
4 GB in size. Fixes #1023.
* Fix data loss bug: qpdf could discard a the character after an
escaped octal string consisting of less than three digits. For
content, this would only happen with QDF or when normalizing
content. Outside of content, it could have happened in any binary
string, such as /ID, if the encoding software used octal escape
strings with less than three digits. This bug was introduced
between 10.6.3 and 11.0.0. Fixes #1050.
2023-10-07 Jay Berkenbilt <[email protected]>
* 11.6.2: release
* Bug fix: when piping stream data, don't call finish on failure
if the failure was caused by a previous call to finish. Fixes
#1042.
* Push .idea directory with the beginning of a sharable JetBrains
CLion configuration.
2023-09-05 Jay Berkenbilt <[email protected]>
* 11.6.1: release
* Fix a logic error introduced in 11.6.0 in the fix to
copyForeignObject. The bug could result in some pages not being
copied.
2023-09-03 Jay Berkenbilt <[email protected]>
* 11.6.0: release
* ascii85 parser: ignore spaces everywhere including between ~
and >. Fixes #973.
* Bug fix: with --pages, if one of the external files had warnings
but the main file did not, the warning was previously not taken
into consideration when determining the exit status.
* Put quotation marks around the command in completion output to
better handle spaces in paths. It is not a perfect fix (ideally,
full shell-compatible quoting should be used), but it handles more
cases than the old code and should handle all reasonable cases of
qpdf being in a directory with a space in its name, which is
common in Windows. Fixes #1021.
* Move check for random number device to runtime instead of
compile time. Since, by default, the crypto provider provides
random numbers, runtime determination of a random number device is
usually not needed. Fixes #1022.
2023-09-02 Jay Berkenbilt <[email protected]>
* Maintain links to foreign pages when copying foreign objects.
This allows hyperlinks in imported files to work. Fixes #1003.
* Bug fix: Return a null object if an attempt is made to to copy a
foreign /Pages object with copyForeignObject. This corrects a
possible crash. Fixes #1010.
* Bug fix: Return a null object if an attempt is made to to copy a
foreign /Pages object with copyForeignObject. Fixes #1003.
* Add /MediaBox to a page if absent. Thanks M. Holger.
* Use std::vector internally for Pl_Buffer to
avoid incompatibility with C++20. Thanks to Zoe Clifford. Fixes #1024.
2023-07-09 Jay Berkenbilt <[email protected]>
* 11.5.0: release
* This release consists entirely of changes made by M. Holger.
Mostly this is changes to the private API, performance
enhancements, code cleanup, and reformatting to 100 columns
instead of 80. For qpdf development, we are starting to use
JetBrains CLion, so a lot of the changes are moving us toward a
cleaner development experience in that environment.
2023-06-15 Jay Berkenbilt <[email protected]>
* Bug fix: when a the same page is copied multiple times, copy
the annotations rather than having multiple pages share an
annotation object. Thanks to M. Holger for the fix. Fixes #600.
2023-06-14 Jay Berkenbilt <[email protected]>
* Add "FUTURE" build option for enabling experimental APIs. Do not
package qpdf built with the FUTURE option as there are no binary
compatibility or even source compatibility guarantees. The option
is intended for developers who want to ensure that future
potentially breaking changes are compatible with their code or
provide feedback on upcoming changes. At present, the only feature
enabled by FUTURE is a move constructor for QPDFObjectHandle.
While this shouldn't break any code, it would change details about
how many copies of a specific QPDFObjectHandle were in existence,
so it could potentially break code that was relying on internal
shared pointer reference counts. Thanks to M. Holger for the idea
and contribution.
2023-05-25 Jay Berkenbilt <[email protected]>
* Add new method Buffer::copy and deprecate Buffer copy
constructor and assignment operator. Buffer copy operations are
expensive as they always involve copying the buffer content. Use
"buffer2 = buffer1.copy();" or "Buffer buffer2{buffer1.copy()};"
to make it explicit that copying is intended. This change was
contributed by M. Holger.
2023-05-21 Jay Berkenbilt <[email protected]>
* 11.4.0: release
2023-05-20 Jay Berkenbilt <[email protected]>
* From M. Holger: add QPDF::newReserved as a better alternative to
QPDFObjectHandle::newReserved. The operation of creating a new
reserved object fits better in the QPDF API. The old call just
delegates to the new one.
2023-05-13 Jay Berkenbilt <[email protected]>
* When an annotation dictionary's appearance dictionary (`/AP`)
has a key that is a stream, disregard `/AS` (which is supposed to
point to a subkey). This enables qpdf to not ignore annotations
that have incorrect values for `/AS` when the appearance stream is
directly in the `/AP` dictionary instead of in a subkey. Fixes
#949.
2023-04-02 Jay Berkenbilt <[email protected]>
* Allow QPDFJob's workflow to be split into a reading phase and a
writing phase to allow the caller to operate on the QPDF object
before it is written. This adds methods QPDFJob::createQPDF and
QPDFJob::writeQPDF and corresponding C API functions
qpdfjob_create_qpdf and qpdfjob_write_qpdf. Thanks to M. Holger
for the contribution.
2023-04-01 Jay Berkenbilt <[email protected]>
* From M. Holger: throw a logic error if an uninitialized or
foreign QPDFObjectHandle is added to an array.
2023-03-18 Jay Berkenbilt <[email protected]>
* Enhance --optimize-images to support images nested inside of
form XObjects. Thanks to Connor Osborne (github user cdosborn) for
the contribution. Fixes #923.
2023-02-25 Jay Berkenbilt <[email protected]>
* 11.3.0: release
* When performing overlay or underlay operations, convert the
original page to a form XObject instead of simply isolating its
contents with q/Q operators. This prevents unbalanced q/Q
operators in any of the original pages from messing up the
graphics state of anything that is overlaid on top of it. Fixes
#904.
2023-02-18 Jay Berkenbilt <[email protected]>
* Treat all linearization errors and warnings as warnings, and
issue them through the normal warning system using the new error
code qpdf_e_linearization. That means that --no-warn will suppress
them, and the file name is included in the warning. Fixes #851.
2023-01-28 Jay Berkenbilt <[email protected]>
* New option --remove-restrictions removes security restrictions
from digitally signed files. Fixes #833.
2023-01-09 Jay Berkenbilt <[email protected]>
* Bug fix: flatten annotations should handle a page with no
/Resources key. Fixes #827.
2022-11-20 Jay Berkenbilt <[email protected]>
* 11.2.0: release
* Add a few convenience methods to QPDFTokenizer::Token for
checking token types. thanks to M. Holger for the contribution.
* Add stream creation methods to the QPDF class as a better
alternative to the ones in the QPDFObjectHandle class. Thanks to
M. Holger for the contribution.
2022-11-19 Jay Berkenbilt <[email protected]>
* Bug fix: handle special case of an earlier xref stream object's
object number being reused by an update made by appending the
file. Fixes #809.
2022-10-08 Jay Berkenbilt <[email protected]>
* Fix major performance bug with the openssl crypto provider when
using OpenSSL 3. The legacy loader and rc4 algorithm was being
loaded with every call to the crypto provider instead of once in
the life of the program. Fixes #798.
* performance_check: add --test option to limit which tests are
run.
2022-10-06 Jay Berkenbilt <[email protected]>
* Change minimum required C++ version from C++-14 to C++-17.
* Fix another symbol export issue with the MinGW build.
2022-10-01 Jay Berkenbilt <[email protected]>
* 11.1.1: release
2022-09-27 Jay Berkenbilt <[email protected]>
* Bug fix: avoid having the AppImage discard the first argument
when renamed to one of the embedded executables. Fixes #789.
* Add AppImage-specific tests to CI. These test different
invocation styles and loading of the proper shared library.
2022-09-26 Jay Berkenbilt <[email protected]>
* Bug fix: avoid using PDF Doc encoding for strings whose PDF Doc
encoding representation starts with UTF-16 or UTF-8 markers. Fixes
#778.
2022-09-27 Jay Berkenbilt <[email protected]>
* Add tests to CI for char being unsigned by default.
2022-09-14 Jay Berkenbilt <[email protected]>
* 11.1.0: release
* Add notes to documentation clarifying that installing the dev
component usually requires the lib component to also be installed.
* Set CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON in cmake to
(hopefully) solve the problem of older installed qpdf headers
interfering with building qpdf from source. Fixes #763.
2022-09-12 Jay Berkenbilt <[email protected]>
* Add some missing DLL exports that only affect the Windows build.
* Remove compile-time test for LL_FMT. It's unlikely that any
compiler new enough to build qpdf still doesn't support %lld.
2022-09-10 Jay Berkenbilt <[email protected]>
* 11.0.0: release
2022-09-09 Jay Berkenbilt <[email protected]>
* Add QPDFObjectHandle::isSameObjectAs to test whether two
QPDFObjectHandle objects point to the same underlying object.
* Expose ability to create custom loggers and to get and set the
logger for QPDF and QPDFJob through the C API.
2022-09-08 Jay Berkenbilt <[email protected]>
* Added new functions to the C API to support qpdf JSON:
qpdf_create_from_json_file, qpdf_create_from_json_data,
qpdf_update_from_json_file, qpdf_update_from_json_data, and
qpdf_write_json. Examples can be found in qpdf-ctest.c (in the
source tree), tests 42 through 47.
* Add QPDFObjectHandle::isDestroyed() to test whether an indirect
object was from a QPDF that has been destroyed.
2022-09-07 Jay Berkenbilt <[email protected]>
* Add QPDFObjectHandle::getQPDF(), which returns a reference, as
an alternative to QPDFObjectHandle::getOwningQPDF().
2022-09-06 Jay Berkenbilt <[email protected]>
* For all bounding box methods in QPDFPageObjectHelper other than
MediaBox, add a parameter `copy_if_fallback`, and add comments
explaining in depth exactly what copy_if_shared and
copy_if_fallback mean. Fixes #664.
* Add new methods getArtBox and getBleedBox to
QPDFPageObjectHelper, completing the set of bounding box methods.
* The --show-encryption option now works even if a correct
password is not supplied. If you were using --show-encryption to
test whether you have the right password, use --requires-password
instead. Fixes #598.
2022-09-05 Jay Berkenbilt <[email protected]>
* Add a move constructor to Buffer, making it possible to move
rather than copy the internal buffer. Thanks to jbarlow83 for the
contribution.
2022-09-02 Jay Berkenbilt <[email protected]>
* Add new QPDF::create() factory method that returns
std::shared_ptr<QPDF>.
* Prevent copying/assigning to QPDF objects in the API. It has
never been safe to do this, but the API wasn't preventing it.
2022-09-01 Jay Berkenbilt <[email protected]>
* Remove QPDFObject.hh from include/qpdf. The only reason to
include was to get QPDFObject::object_type_e. Instead, include
qpdf/Constants.h, and change `QPDFObject::ot_` to `::ot_`.
* More optimizations and cleanup from m-holger (#726, #730)
including major refactor of QPDF's internal representations of
objects. In addition to a large performance improvement, this also
made it possible for QPDFObjectHandle::getOwningQPDF() to return a
null pointer if the owning QPDF had been destroyed. (A more
complete solution to this problem will be introduced for qpdf 12.)
This work also paves the way for a future alternative to
QPDFObjectHandle that is more idiomatic C++ and has greater type
safety.
2022-08-31 Jay Berkenbilt <[email protected]>
* From m-holger (#729): refactor QPDF's parser into a new
QPDFParser class, cleaning the code, significantly improving
performance.
2022-08-27 Jay Berkenbilt <[email protected]>
* From m-holger: major refactoring of QPDFTokenizer to improve
readability and to optimize performance. This also included some
optimizations to some InputSource classes. Thanks for this
excellent contribution. Fixes #749, #442.
2022-08-07 Jay Berkenbilt <[email protected]>
* Add new build configuration option ENABLE_QTC, which is off by
default when not running in MAINTAINER_MODE. When this is off,
QTC coverage calls sprinkled throughout the qpdf source code are
compiled out for increased performance. See "Build Options" in the
manual for a discussion. Fixes #714.
2022-08-06 Jay Berkenbilt <[email protected]>
* Added by m-holger: QPDF::getObject() method as a simpler form of
getObjectByID or getObjectByObjGen. The older methods are being
retained for compatibility and are not deprecated.
2022-07-24 Jay Berkenbilt <[email protected]>
* include/qpdf/JSON.hh: Schema validation: allow a single item to
appear anywhere that the schema has an array of a single item.
This makes it possible to change an element of the schema from an
item to an array to allow the data to accept an array where a
single value was previously required. This change is needed to
allow QPDFJob JSON to start accepting multiple items where a
single item used to be expected without breaking backward
compatibility. Without this change, the earlier fix to
removeAttachment would be a breaking change. Also allow the schema
to contain a multi-element array, which means that the output has
to have an array of the same length in the corresponding location,
and each element is validated against the corresponding schema
element.
* QPDFObjectHandle: for the methods insertItem, appendItem,
eraseItem, replaceKey, and removeKey, add a corresponding
"AndGetNew" and/or "AndGetOld" methods. The ones that end with
"AndGetNew" return the newly added item. The ones that end with
"AndGetOld" return the old value. The AndGetNew methods make it
possible to create a new object, add it to an array or dictionary,
and get a handle to it all in one line. The AndGetOld methods make
it easier to retrieve an old value when removing or replacing it.
* Thanks to m-holger for doing significant cleanup of private APIs
and internals around QPDFObjGen and for significantly improving
the performance of QPDFObjGen -- See #731. This includes a few
user-visible changes:
- Addition of QPDFObjectHandle::StreamDataProvider::provideStreamData
overloads that take QPDFObjGen
- Addition of an optional argument to QPDFObjGen::unparse allowing
specification of a separator character, with the default
resulting in the old behavior
Examples have been updated to use improved APIs. The old
provideStreamData overloads will continue to be supported, so
updating older code to use the new interfaces is entirely at the
programmer's discretion.
2022-06-25 Jay Berkenbilt <[email protected]>
* Add tracking methods QPDF::everCalledGetAllPages() and
QPDF::everPushedInheritedAttributesToPages(). Since those methods
may have the side effect of creating new objects and replace
objects in various places in the pages tree, it's useful to be
able to find out whether they've ever been called.
2022-06-18 Jay Berkenbilt <[email protected]>
* Add QPDFJob::registerProgressReporter, making it possible to
override the progress reporter that is used when --progress (or
the equivalent) is configured with QPDFJob. This is
qpdfjob_register_progress_reporter in the C API.
* Add examples that show how to capture QPDFJob's output by
configuring the default logger (qpdfjob-save-attachment.cc,
qpdfjob-c-save-attachment.c). Fixes #691.
* Add C API for QPDFLogger -- see qpdflogger-c.h
* Add additional qpdfjob C API functions take a handle.
* Add qpdf_exit_code_e to Constants.h so that exit codes from
QPDFJob are accessible to the C API.
* When --progress or --verbose is combined with writing to
standard output, progress reporting and verbose messages go to
standard error. Previously it was disabled in this case.
2022-06-05 Jay Berkenbilt <[email protected]>
* QPDFJob: API breaking change: QPDFJob::doIfVerbose passes a
Pipeline& rather than a std::ostream& to the the callback
function.
* Add integer types to pipeline's operator<<: short, int, long,
long long, unsigned short, unsigned int, unsigned long, unsigned
long long.
2022-05-30 Jay Berkenbilt <[email protected]>
* qpdf JSON is now at version 2. New command-line arguments:
--json-output, --json-input, --update-from-json. New methods
QPDF::writeJSON, QPDF::createFromJSON, QPDF::updateFromJSON. For
details, see the "qpdf JSON" chapter of the manual.
* When showing encryption data in json output, when the user
password was recovered with by the owner password and the
specified password does not match the user password, reveal the
user password. This is not possible with 256-bit keys.
* Include additional information in --list-attachments --verbose
and in --json --json-key=attachments.
* Add QUtil::qpdf_time_to_iso8601 and QUtil::pdf_time_to_iso8601
for converting PDF/qpdf timestamps to ISO-8601 date format.
2022-05-18 Jay Berkenbilt <[email protected]>
* Add QUtil::FileCloser to the public API. This is a simple inline
class to help with automatic file closing.
2022-05-17 Jay Berkenbilt <[email protected]>
* Allow passing *uninitialized* (not null) objects to
replaceStreamData as filter and/or decode_parms to leave any
existing values for /Filter and /DecodeParms untouched.
2022-05-15 Jay Berkenbilt <[email protected]>
* Add QUtil::is_long_long to test whether a string can be
converted to a long long and back without loss of information.
2022-05-04 Jay Berkenbilt <[email protected]>
* JSON: add a new "blob" type that takes a function to write data
into. The blob is serialized as a base64-encoded representation of
whatever is written to the function.
* FileInputSource has new constructors that eliminate the need to
call setFilename or setFile in most cases.
* Enhance JSON by adding a write method that takes a Pipeline* and
depth, and add several helper methods to make it easier to write
large amounts of JSON incrementally without having to have the
whole thing in memory.
* json v1 output: make "pages" and "objects" consistent.
Previously, "objects" always reflected the objects exactly as they
appeared in the original file, while "pages" reflected objects
after repair of the pages tree. This could be misleading. Now, if
"pages" is specified, "objects" shows the effects of repairing the
page tree, and if not, it doesn't. This makes no difference for
correct PDF files that don't have problems in the pages tree. JSON
v2 will behave in a similar way.
2022-05-03 Jay Berkenbilt <[email protected]>
* Add new Pipeline class Pl_String which appends to a std::string&
passed to it at construction.
* Add new Pipeline class Pl_OStream, similar to Pl_StdioFile but
takes a std::ostream instead of a FILE*.
* Add new convenience methods to Pipeline: writeCStr and
writeString. Also add a limit << operator that takes C strings and
std::strings. Also add an overloaded version of write that takes
"char const*".
* API change: Pipeline::write now takes "unsigned char const *"
instead of "unsigned char*". Callers shouldn't have to change
anything, though can stop using writable strings or
QUtil::unsigned_char_pointer. If you have implemented your own
pipelines, you should change your write method to take a const
pointer.
2022-05-01 Jay Berkenbilt <[email protected]>
* JSON: add reactors to the JSON parser, making it possible to
react to JSON parsing events as they occur and to block the
results from being stored. This makes it possible to incrementally
parse arbitrarily large JSON inputs.
2022-04-30 Jay Berkenbilt <[email protected]>
* QPDFWriter: change encryption API calls
- Remove deprecated versions of setR*EncryptionParameters
methods from before qpdf 8.4.0
- Replace setR2EncryptionParameters with
setR2EncryptionParametersInsecure
- Replace setR3EncryptionParameters with
setR3EncryptionParametersInsecure
- Replace setR4EncryptionParameters with
setR4EncryptionParametersInsecure
* C API: change encryption API calls to match C++ interface
- Remove pre-8.4.0 functions:
- qpdf_set_r3_encryption_parameters
- qpdf_set_r4_encryption_parameters
- qpdf_set_r5_encryption_parameters
- qpdf_set_r6_encryption_parameters
- Add "_insecure" to insecure encryption triggers:
- Replace void qpdf_set_r2_encryption_parameters
with qpdf_set_r2_encryption_parameters_insecure
- Replace void qpdf_set_r3_encryption_parameters2
with qpdf_set_r3_encryption_parameters_insecure
- Replace void qpdf_set_r4_encryption_parameters2
with qpdf_set_r4_encryption_parameters_insecure
* Make attempting to write encrypted files that use RC4 (40-bit or
128-bit without AES) an error rather than a warning when
--allow-weak-crypto is not specified. Fixes #576.
2022-04-24 Jay Berkenbilt <[email protected]>
* Bug fix: "removeAttachment" in the job JSON now takes an array
of strings instead of a string. It should have taken an array of
strings since the corresponding command-line argument,
--remove-attachment, is repeatable. Fixes #693.
* Deprecate QPDFObjectHandle::replaceOrRemoveKey -- it does and
always has done the same thing as replaceKey.
2022-04-23 Jay Berkenbilt <[email protected]>
* Add a new QPDF::warn method that takes the parameters of
QPDFExc's constructor except for the filename, which is taken from
the QPDF object. This is a shorter way to issue warnings on behalf
of a QPDF object.
* Add new method QUtil::is_explicit_utf8 that tests whether a
string is explicitly marked as being UTF-8 encoded, as allowed by
the PDF 2.0 spec. Such a string starts with the bytes 0xEF 0xBB
0xBF, which is the UTF-8 encoding of U+FEFF.
* Add new method QUtil::get_next_utf8_codepoint as a low-level
helper for iterating through the UTF-8 characters in a byte
string.
2022-04-16 Jay Berkenbilt <[email protected]>
* Breaking CLI change: the default value for --json is now
"latest" rather than "1". At this moment, "1" is the latest
version, but version "2" will be added before the release of
qpdf 11.
* Perform code cleanup including some source-compatible but not
binary compatible changes to function signatures, use of anonymous
namespaces, and use of "= default" and "= delete" in declarations.
2022-04-09 Jay Berkenbilt <[email protected]>
* Replace PointerHolder with std::shared_ptr through the QPDF API.
A backward-compatible interface is provided and enabled by default
with a warning that can be turned off. See "Smart Pointers" in the
"Design and Library Notes" section of the manual for information
including a detailed migration process to assist with migrating
code that uses the qpdf library.
2022-04-03 Jay Berkenbilt <[email protected]>
* Add automatic code formatting with clang-format. See "Code
Formatting" in the "Contributing to qpdf" chapter of the manual.
2022-03-19 Jay Berkenbilt <[email protected]>
* 10.6.3.0cmake1: unofficial release
* Conversion of build system to cmake. This change doesn't include
any user-visible functional changes to the library API or CLI but
completely replaces the build system. Details can be found in the
manual in the "Building and Installing QPDF" and "Notes for
Packagers" sections, especially "Converting From autoconf to
cmake" in "Building and Installing QPDF". Highlights of the
changes can be found in the release notes.
2022-03-08 Jay Berkenbilt <[email protected]>
* 10.6.3: release
* Use Windows 2022 github runners and therefore Visual Studio 2022
to create Windows distributions
* Fix DLL export issue with mingw (Windows)
2022-03-07 Jay Berkenbilt <[email protected]>
* Minor internal changes to assist with building in other
environments: rename internal bits.icc to qpdf/bits_functions.hh
(not part of public API), enforce reordering of header files to
prevent jpeglib.h from interfering with other headers, remove an
unused header that was accidentally added in 10.6.0 but never
referenced by any code.
* Make build work and tests work when NDEBUG is defined. This
involved a few changes to some test files but no changes to any
library code.
2022-02-25 Jay Berkenbilt <[email protected]>
* Bug fix in JSON parser: accept \/ in a string as valid input per
JSON spec even though we don't translate / to \/ on output.
2022-02-22 Jay Berkenbilt <[email protected]>
* Recognize PDF strings explicitly marked as UTF-8 as allowed by
the PDF 2.0 spec. Fixes #654.
2022-02-18 Jay Berkenbilt <[email protected]>
* Bug fix: when generating appearance streams, the font size was
substituted incorrectly from /DA if Tf was absent or the number
preceding Tf was out of range. Fixes #655.
2022-02-16 Jay Berkenbilt <[email protected]>
* 10.6.2: release
2022-02-15 Jay Berkenbilt <[email protected]>
* Fix asymmetrical logic between
QPDFObjectHandle::newUnicodeString() and
QPDFObjectHandle::getUTF8Val(). The asymmetrical logic didn't
matter before fixing the PDF Doc transcoding bugs.
* When analyzing PDF strings, recognize UTF-16LE as UTF-16. The
PDF spec only allows UTF-16BE, but most readers seem to allow
both. Fixes #649.
* Bug fix: 10.6.0 inadvertently removed an unknown/undocumented
CLI parsing feature, which has been restored in 10.6.2. Fixes #652.
* Don't map 0x18 through 0x1f, 0x7f, 0x9f, or 0xad as fixed points
when transcoding UTF-8 to PDFDoc. These code points have different
meanings in those two encoding systems. Fixes #650.
2022-02-11 Jay Berkenbilt <[email protected]>
* 10.6.1: release
* Fix some compilation issues from use of abs without including
proper headers.
2022-02-09 Jay Berkenbilt <[email protected]>
* 10.6.0: release
* Fix one more PDF doc encoding omission: 0xAD is also undefined.
Fixes #637.
2022-02-08 Jay Berkenbilt <[email protected]>
* Bug fix: when splitting pages with --split-pages or selecting
pages with --pages, set the output PDF version to the maximum of
all the input PDF versions. This is a fix to QPDFJob. If you are
creating output PDF files yourself from multiple inputs, you will
need to code the same thing. The new PDFVersion object, its
updateIfGreater() method, and the new QPDF and QPDFWriter methods
described below make this very easy to do. Fixes #610.
* Add new class PDFVersion for more convenient comparison of PDF
version numbers from the %!PDF header.
* Add QPDF::getVersionAsPDFVersion() to return the PDF version and
extension together as a PDFVersion object instead of a string.
* Add a QPDFWriter::setMinimumPDFVersion() that takes a PDFVersion
object.
2022-02-06 Jay Berkenbilt <[email protected]>
* Pl_Buffer and QPDFWriter: add getBufferSharedPointer(), which
turns a PointerHolder<Buffer> but will return a
std::shared_ptr<Buffer> in qpdf 11.
* From m-holger: add getKeyIfDict(), which calls getKey for
dictionaries and returns null if called on null. This is for
easier access to optional, lower-level dictionaries.
2022-02-05 Jay Berkenbilt <[email protected]>
* Add several new accessors to QPDFObjectHandle: the bool
getValueAsX(X&) accessors allow an alternative way to retrieve
values from QPDFObjectHandle objects and can result in more
concise code in many situations. Thanks to m-holger for the
contribution.
* Add qpdf_oh_new_binary_unicode_string and
qpdf_oh_get_binary_utf8_value to the C API. This makes it possible
to handle UTF-8-encoded strings with embedded NUL characters. Thanks
to m-holger for the contribution.
* Add a global user-defined string literal "_qpdf" as a shorthand
for QPDFObjectHandle::parse, allowing you to create
QPDFObjectHandle objects with
QPDFObjectHandle oh = "<</Some (PDF)>>"_qpdf;
* Expose QPDF::emptyPDF to the C API as qpdf_empty_pdf()
* Add comments letting people know that the version string
returned by QPDF::QPDFVersion and qpdf_get_qpdf_version is static.
* Add QUtil::make_unique_cstr to return a std::unique_ptr<char[]>
as an alternative to QUtil::copy_string and
QUtil::make_shared_cstr.
2022-02-04 Jay Berkenbilt <[email protected]>
* New preprocessor symbols QPDF_MAJOR_VERSION, QPDF_MINOR_VERSION,
QPDF_PATCH_VERSION as numbers and QPDF_VERSION as a string. These
can be used for feature testing in code. These are in qpdf/DLL.h,
which is included by every header that adds to the public API.
Since these constants are introduced in version 10.6, it's
important for them to be in a header that everyone already
includes so you don't have to try to include a header that won't
be there.
* PointerHolder: add a get() method and a use_count() method for
compatibility with std::shared_ptr. In qpdf 11, qpdf's APIs will
switch to using std::shared_ptr instead of PointerHolder, though
there will be a PointerHolder class with a backward-compatible
API. To ease the transition, we are adding get() now with the same
semantics as std::shared_ptr's get. Note that there is a
difference in behavior: const PointerHolder has always behaved
incorrectly. const PointerHolder objects only returned const
pointers. This is wrong. If you want a const pointer, use
PointerHolder<T const>. A const PointerHolder just shouldn't allow
its pointer to be reassigned. The new get() method behaves
correctly in that calling get() on a const PointerHolder to a
non-const pointer returns a non-const pointer. This is the way
regular pointers behave.
2022-02-01 Jay Berkenbilt <[email protected]>
* Major refactor: all functionality from the qpdf CLI is now
available for library users using the QPDFJob class. See comments
in include/qpdf/QPDFJob.hh and a new chapter about QPDFJob in the
manual. QPDFJob provides fluent interfaces for setting options
that exactly map to command-line arguments. There are also methods
for initializing QPDFJob from an argv array and from a JSON
object.
* A light C API around basic QPDFJob functionality is in
include/qpdf/qpdfjob-c.h.p
* Add new functions version of QUtil::call_main_from_wmain that
takes a constant argv array.
2022-01-31 Jay Berkenbilt <[email protected]>
* Have --json-help just output the JSON object, leaving a
description to --help and the manual.
* The --json flag now takes a version number as an optional
parameter. The default will remain version 1 for compatibility
until the release of qpdf 11, after which it will become "latest".
At this time, there's only version 1, but a version 2 may appear
in a future qpdf.
2022-01-28 Jay Berkenbilt <[email protected]>
* Add QPDFUsage exception, which is thrown by QPDFJob to indicate
command-line usage or job configuration errors.
2022-01-22 Jay Berkenbilt <[email protected]>
* Add QUtil::make_shared_cstr to return a std::shared_ptr<char>
instead of a char* like QUtil::copy_string
* JSON: for (qpdf-specific, not official) "schema" checking, add
the ability to treat missing fields as optional. Also ensure that
values in the schema are dictionary, array, or string.
* Add convenience methods isNameAndEquals and isDictionaryOfType
to QPDFObjectHandle with corresponding functions added to the C
API. Thanks to m-holger for the contribution.
2022-01-17 Jay Berkenbilt <[email protected]>
* Add JSON::parse. Now qpdf's JSON class implements a
general-purpose JSON parser and serializer, but there are better
options for general use. This is really designed for qpdf's
internal use and is set up to be compatible with qpdf's existing
API and to hook into a planned JSON-based API to the QPDFJob
class.
* Add isDictionary and isArray to JSON
2022-01-11 Jay Berkenbilt <[email protected]>
* Major overhaul of documentation and help for the qpdf
command-line tool. qpdf --help is now broken into topics rather
than being one great wall of text, and the command-line arguments
are indexed in the manual. The entire text of the "Running qpdf"
chapter has been reviewed thoroughly. Many thanks once again to
M. Holger for a detailed review and editorial assistance with the
manual.
* Bug fix: add missing characters from PDF doc encoding.
Fixes #606.
2021-12-29 Jay Berkenbilt <[email protected]>
* Add method QUtil::file_can_be_opened
2021-12-21 Jay Berkenbilt <[email protected]>
* 10.5.0: release
* Add documentation link to top-level README
* Discontinue inclusion of the pre-built documentation in the
source distribution. Consult the packaging documentation in the
manual for details. The file README-doc.txt is installed in the
doc directory by default and contains information that users will
need to know to find the documentation.
2021-12-19 Jay Berkenbilt <[email protected]>
* C API: clarify documentation around string lengths. Add two new
methods: qpdf_oh_get_binary_string_value and
qpdf_oh_new_binary_string to make the need to handle the length
and data separate in more explicit in cases in which the string
data may contain embedded null characters.
2021-12-17 Jay Berkenbilt <[email protected]>
* C API: simplify error handling for uncaught errors (never in a
released version) and clarify documentation in qpdf-c.h around
error handling. See qpdf-c.h for details, including how to check
for errors and the new function qpdf_silence_errors.
* C API: expose getTypeCode and getTypeName from QPDFObjectHandle.
Fixes #597.
* C API: add functions for working with stream data. Search for
"STREAM FUNCTIONS" in qpdf-c.h. Fixes #596.
* QPDFObjectHandle object types have been moved from
QPDFObject::object_type_e to qpdf_object_type_e (defined in
Constants.h). Old values are available for backward compatibility.
* Add Pl_Buffer::getMallocBuffer() to initialize a buffer with
malloc in support of the C API
2021-12-16 Jay Berkenbilt <[email protected]>
* Add several functions to the C API for working with pages. C
wrappers around several of the "Legacy" page operations from
QPDFObjectHandle.hh have been added. See "PAGE FUNCTIONS" in
qpdf-c.h for details. Fixes #594.
2021-12-12 Jay Berkenbilt <[email protected]>
* Convert documentation from docbook to reStructuredText/Sphinx.
2021-12-10 Jay Berkenbilt <[email protected]>
* Handle bitstream overflow errors more gracefully. Fixes #581.
* C API: add qpdf_get_object_by_id, qpdf_make_indirect_object, and
qpdf_replace_object, exposing the corresponding methods in QPDF
and QPDFObjectHandle. Fixes #588.
* Add missing QPDF_DLL to QPDFObjectHandle::addTokenFilter so that
it is actually accessible as part of the public interface as
intended. Fixes #580.
* C API: Overhaul how errors are handle the C API's object handle
interfaces. Clarify documentation regarding object accessors and
how type errors and warnings are handled. Many cases that used to
crash code that used the C API can now be trapped and will be
written stderr if not trapped. See qpdf-c.h for details.
* C API: Add qpdf_oh_new_uninitialized to explicitly create
uninitialized object handles.
* Add new error code qpdf_e_object that is used for exceptions
(including warnings) that are caused by using QPDFObjectHandle
methods on object handles of the wrong type.
2021-12-02 Jay Berkenbilt <[email protected]>
* C API: Add qpdf_oh_is_initialized.
* C API: Add qpdf_get_last_string_length to return the length of
the last string returned. This is necessary in order to fully
retrieve values of strings that may contain embedded null characters.
* C API: Add qpdf_oh_new_object to clone an object handle. Change
implemented by m-holger in #587.
2021-11-16 Jay Berkenbilt <[email protected]>
* 10.4.0: release
2021-11-10 Jay Berkenbilt <[email protected]>
* Add --allow-weak-crypto option to suppress warnings about use of
weak cryptographic algorithms. Update documentation around this
issue. Fixes #358.
2021-11-07 Jay Berkenbilt <[email protected]>
* Relax xref recovery logic a bit so that files whose objects are
either missing endobj or have endobj at other than the beginning
of a line can still be recovered. Fixes #573.
2021-11-04 Jay Berkenbilt <[email protected]>
* Add support for OpenSSL 3. Fixes #568.
The OpenSSL version is detected at compile-time. If you want to
build with OpenSSL 3 on a system that has OpenSSL 1 installed, you
can run configure like this (or similar to this depending on how
you installed openssl3):
pc_openssl_CFLAGS=-I/path/to/openssl3/include \
pc_openssl_LIBS='-L/path/to/openssl3/lib64 -lssl -lcrypto' \
./configure
where /path/to/openssl3 is wherever your OpenSSL 3 distribution is
installed. You may also need to set the LD_LIBRARY_PATH
environment variable if it's not installed in a standard location.
* Add range check in QPDFNumberTreeObjectHelper (fuzz issue 37740).
* Add QIntC::range_check_subtract to do range checking on
subtraction, which has different boundary conditions from
addition.
* Bug fix: fix crash that could occur under certain conditions
when using --pages with files that had form fields. Fixes #548.
* Add an extra check to the library to detect when foreign objects
are inserted directly (instead of using
<function>QPDF::copyForeignObject</function>) at the time of
insertion rather than when the file is written. Catching the error
sooner makes it much easier to locate the incorrect code.
2021-11-03 Jay Berkenbilt <[email protected]>
* Bug fix: make overlay/underlay work on a page with no resource