forked from qpdf/qpdf
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathChangeLog
4944 lines (3604 loc) · 190 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
2024-09-20 Chao Li <[email protected]>
* Add C API function qpdf_oh_free_buffer to release memory allocated
by stream data functions.
2024-08-25 M Holger <[email protected]>
* Add new command-line arguments --remove-metadata and --remove-info
to exclude document metadata and information from the output PDF
file. Patially fixes #1145.
2024-08-06 M Holger <[email protected]>
* Bug fix: when writing real numbers as JSON ensure that they don't
have a trailing decimal point. Fixes #1261.
2024-07-14 M Holger <[email protected]>
* Bug fix: handle named destinations where the entry is a
dictionary with /D entry instead of an explicit destination.
Fixes #1238.
2024-07-04 M Holger <[email protected]>
* Treat corrupt JPEG streams as unfilterable. This avoids them
getting uncompressed when writing PDF files with decode level all.
2024-07-02 Jay Berkenbilt <[email protected]>
* Add QPDF::setMaxWarnings to set the maximum of warnings before
warning suppression.
* Add static option to Pl_DCT to limit memory usage of
decompression. The option is generally exposed but is primarily
intended to support fuzz tests, which have explicit memory limits
that are smaller than what is commonly seen in the wild with PDF
files.
* Add static option to Pl_DCT to control whether decompression of
corrupt JPEG data is attempted.
2024-07-01 M Holger <[email protected]>
* Bug fix: certain invalid object streams caused the insertion of
invalid entries into in the xref table.
2024-06-29 M Holger <[email protected]>
* Bug fix: in QPDFOutlineObjectHelper detect loops in the list of
direct children of an outline item.
2024-06-27 M Holger <[email protected]>
* Add sanity check in QPDF xref table reconstruction to reject
objects with impossibly large object id in order to improve
handling of severely damaged PDF files.
2024-06-25 M Holger <[email protected]>
* Detect severely damaged PDF files early. After parsing the xref
table in QPDF throw a damagedPDF exception if the root of the pages
tree is not a dictionary.
2024-06-07 Jay Berkenbilt <[email protected]>
* 11.9.1: release
2024-06-06 Jay Berkenbilt <[email protected]>
* Rewrite a recursive function to be iterative in linearization to
enable more complex files to be linearized, especially on Windows.
2024-02-24 Jay Berkenbilt <[email protected]>
* Avoid non-standard use of `std::basic_string_view`. Contribution
from Zoe Clifford.
2024-02-24 Jay Berkenbilt <[email protected]>
* 11.9.0: release
2024-02-17 Jay Berkenbilt <[email protected]>
* Add ENABLE_COVERAGE cmake option to assist with generating
coverage reports.
* From M. Holger: add QPDFObjectHandle::writeJSON to directly
write a JSON representation to a pipeline. This is much faster
than writing the serialized result of getJSON.
2024-02-11 Jay Berkenbilt <[email protected]>
* The previous fix to #1056 was incomplete. When setting a check
box value, the previous fix allowed any value other than /Off to
mean checked. Now we also set the actual value based on the
allowable non-/Off value in the normal appearance dictionary.
Fixes #1056.
2024-02-03 Jay Berkenbilt <[email protected]>
* Add fuzz testing for JSON.
2024-01-15 Jay Berkenbilt <[email protected]>
* Add JSON::getDictItem (from m-holger)
2024-01-10 Jay Berkenbilt <[email protected]>
* Allow --overlay and --underlay to be repeated. They may appear
multiple times on the command-line and will be stacked in the
order in which they appear. In QPDFJob JSON, the overlay and
underlay keys may contain arrays. For compatibility, they may also
contain a single dictionary.
2024-01-09 Jay Berkenbilt <[email protected]>
* Add new command-line arguments --file and --range which can be
used within --pages in place of positional arguments. Allow --file
to be used inside of --overlay and --underlay as well. These new
options can be freely intermixed with positional arguments. Also
add file(), range(), and password() to QPDFJob::PagesConfig as an
alternative to pageSpec.
2024-01-08 Jay Berkenbilt <[email protected]>
* 11.8.0: release
2024-01-07 Jay Berkenbilt <[email protected]>
* Bug fix: treat references to older generations of objects as
null.
2024-01-06 Jay Berkenbilt <[email protected]>
* When recovering a file's xref table, attempt to find xref
streams if a traditional trailer dictionary is not found. Fixes
#1103.
2024-01-05 Jay Berkenbilt <[email protected]>
* Add --set-page-labels command-line argument and supporting API.
Fixes #939.
- QPDFJob::Config::setPageLabels
- pdf_page_label_e enumerated type
- QPDFPageLabelDocumentHelper::pageLabelDict
2024-01-01 Jay Berkenbilt <[email protected]>
* Support comma-separated numeric values with --collate to select
different group sizes from different files. Fixes #505.
* Support "x" before a group in a numeric range to exclude a group
from the previous group. Details are in the manual. Fixes #564,
#790.
2023-12-29 Jay Berkenbilt <[email protected]>
* When flattening annotations, preserve annotations without any
appearance information at all, such as types /Link, /Popup, and
/Projection. Fixes #1039.
2023-12-25 Jay Berkenbilt <[email protected]>
* Detect overlong UTF-8 in the UTF-8 decoder, and fix detection of
8-bit characters in erroneous UTF-8 strings.
2023-12-24 Jay Berkenbilt <[email protected]>
* 11.7.0: release
2023-12-23 Jay Berkenbilt <[email protected]>
* Define CPACK_NSIS_MODIFY_PATH for the Windows builds so the
official installers will offer to modify PATH when installing
qpdf. Fixes #1054.
* Add QPDFAcroFormDocumentHelper::disableDigitalSignatures, which
disables any digital signature fields, leaving their visual
representations intact. The --remove-restrictions command-line
argument now calls this. Fixes #1015.
2023-12-22 Jay Berkenbilt <[email protected]>
* Generate a more complete qpdf "man page" from the same source as
qpdf --help. Fixes #1064.
* Allow the syntax "--encrypt --user-password=user-password
--owner-password=owner-password --bits={40,128,256}" when
encrypting PDF files. This is an alternative to the syntax
"--encrypt user-password owner-password {40,128,256}", which will
continue to be supported. The new syntax works better with shell
completion and allows creation of passwords that start with "-".
Fixes #874.
* When setting a check box value, allow any value other than /Off
to mean checked. This is permitted by the spec. Previously, any
value other than /Yes or /Off was rejected. Fixes #1056.
2023-12-21 Jay Berkenbilt <[email protected]>
* Fix to QPDF JSON: a floating point number that appears in
scientific notation will be converted to fixed-point notation,
rounded to six digits after the decimal point. Fixes #1079.
* Fix to QPDF JSON: the syntax "n:/pdf-syntax" is now accepted as
an alternative way to represent names. This can be used for any
name (e.g. "n:/text#2fplain"), but it is necessary when the name
contains binary characters. For example, /one#a0two must be
represented as "n:/one#a0two" since the single byte a0 is not
valid in JSON. Fixes #1072.
* From M. Holger: Refactor QPDFParser for performance. See #1059
for a discussion.
2023-12-20 Jay Berkenbilt <[email protected]>
* Update code and tests so that qpdf's test suite no longer
depends on the output of any specific zlib implementation. This
makes it possible to get a fully passing test suite with any
API-compatible zlib library. CI tests with the default zlib as
well as zlib-ng (including verifying that zlib-ng is not the
default), but any zlib implementation should work. Fixes #774.
* Bug fix: with --compress-streams=n, don't compress object, XRef,
or linearization hint streams.
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.
* Bug fix from M. Holger: the default for /Columns in PNG filter
is 1, but libqpdf was acting like it was 0.
* Enhancement from M. Holger: add methods to Buffer to work more
easily with std::string.
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,