forked from qpdf/qpdf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChangeLog
4307 lines (3163 loc) · 169 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
2022-06-25 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* Add QUtil::FileCloser to the public API. This is a simple inline
class to help with automatic file closing.
2022-05-17 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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-29 Jay Berkenbilt <ejb@ql.org>
* QPDFObjectHandle: for the methods insertItem, appendItem,
eraseItem, replaceKey, and removeKey, add a corresponding "AndGet"
method (insertItemAndGet, appendItemAndGet, eraseItemAndGet,
replaceKeyAndGet, and removeKeyAndGet) that returns the newly
inserted, replaced, or removed item. This makes it possible to
create a new object, add it to an array or dictionary, and get a
handle to it all in one line.
2022-04-24 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* Add automatic code formatting with clang-format. See "Code
Formatting" in the "Contributing to qpdf" chapter of the manual.
2022-03-19 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* Recognize PDF strings explicitly marked as UTF-8 as allowed by
the PDF 2.0 spec. Fixes #654.
2022-02-18 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 10.6.2: release
2022-02-15 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 10.6.1: release
* Fix some compilation issues from use of abs without including
proper headers.
2022-02-09 Jay Berkenbilt <ejb@ql.org>
* 10.6.0: release
* Fix one more PDF doc encoding omission: 0xAD is also undefined.
Fixes #637.
2022-02-08 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* Add QPDFUsage exception, which is thrown by QPDFJob to indicate
command-line usage or job configuration errors.
2022-01-22 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* Add method QUtil::file_can_be_opened
2021-12-21 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* Convert documentation from docbook to reStructuredText/Sphinx.
2021-12-10 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 10.4.0: release
2021-11-10 Jay Berkenbilt <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* 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 <ejb@ql.org>
* Bug fix: make overlay/underlay work on a page with no resource
dictionary. Fixes #527.
2021-11-02 Jay Berkenbilt <ejb@ql.org>
* Add QPDF::findPage to the public API. This is primarily to help
improve the efficiency of code that wraps the qpdf library, such
as pikepdf. Fixes #516.
* zlib-flate: warn and exit with code 3 when there is corrupted
input data even when decompression is possible. We do this in the
zlib-flate CLI so that it can be more reliably used to test the
validity of zlib streams, but we don't warn by default in qpdf
itself because PDF files in the wild exist with this problem and
other readers appear to tolerate it. There is a PDF in the qpdf
test suite (form-filled-by-acrobat.pdf) that was written by a
version of Adobe Acrobat that exhibits this problem. Fixes #562.
* Add Pl_Flate::setWarnCallback to make it possible to be notified
of data errors that are recoverable but still indicate invalid
data.
* Improve error reporting when someone forgets the -- after
--pages. Fixes #555.
2021-05-12 Jay Berkenbilt <ejb@ql.org>
* Bug fix: ensure we don't overflow any string bounds while
handling completion, even when we are given bogus input values.
Fixes #441.
2021-05-09 Jay Berkenbilt <ejb@ql.org>
* Improve performance of preservation of object streams by
avoiding unnecessary traversal of objects when there are no object
streams.
2021-05-08 Jay Berkenbilt <ejb@ql.org>
* 10.3.2: release
* Fix problem that caused the generated manual from being included
in the Windows distributions. Fixes #521.
* Fix 11-year-old bug of leaving unreferenced objects in preserved
object streams. Fixes #520.
2021-04-17 Jay Berkenbilt <ejb@ql.org>
* Portability fix: use tm_gmtoff rather than global timezone
variable if available to get timezone offset. This fixes
compilation on BSD and also results in a daylight saving
time-aware offset for Linux or other GNU systems. Fixes #515.
2021-04-05 Jay Berkenbilt <ejb@ql.org>
* When adding a page, if the page already exists, make a shallow
copy of the page instead of throwing an exception. This makes the
behavior of adding a page from the library consistent with what
the CLI does and also with what the library does if it starts with
a file that already has a duplicated page. Note that this means
that, in some cases, the page you pass to addPage or addPageAt
(either in QPDF or QPDFPageDocumentHelper) will not be the same
object that actually gets added. (This has actually always been
the case.) That means that, if you are going to do subsequent
modification on the page, you should retrieve it again.
2021-03-11 Jay Berkenbilt <ejb@ql.org>
* 10.3.1: release
* Bug fix: allow /DR to be direct in /AcroForm
2021-03-04 Jay Berkenbilt <ejb@ql.org>
* 10.3.0: release
* The last several changes are in support of fixing more complex
cases of keeping form fields working properly through page copying
operations. Fixes #509.
* Deprecated QPDFAcroFormDocumentHelper::copyFieldsFromForeignPage
-- use QPDFAcroFormDocumentHelper::fixCopiedAnnotations instead.
The API for dealing with annotations and form fields around
copying pages is extremely complex and very hard to get right. It
is planned for a future version of qpdf to have a higher level
interface for dealing with copying pages around and preserving
document-level constructs.
* Add QPDFAcroFormDocumentHelper::getFieldsWithQualifiedName for
returning a list of fields by name.
* Add QPDFAcroFormDocumentHelper::addAndRenameFormFields to add a
collection of fields while ensuring that, within the collection,
fields with the same name continue to have the same name, but that
they don't conflict with exiting fields in the document.
* Add QPDFAcroFormDocumentHelper::setFormFieldName for changing
the name of a form field in a manner that preserves
QPDFAcroFormDocumentHelper's cache.
2021-03-03 Jay Berkenbilt <ejb@ql.org>
* Handle /DR properly when copying form fields. This is a
significant rework of the form field copying from 10.2.0. It
ensures that when copy fields from different files, we resolve any
conflicting names in resources.
* Add QPDFMatrix::operator==
* Add QPDFObjectHandle::makeResourcesIndirect
2021-03-02 Jay Berkenbilt <ejb@ql.org>
* Add an optional resource_names argument to getUniqueResourceName
for added efficiency.
* Add conflict detection QPDFObjectHandle::mergeResources.
2021-03-01 Jay Berkenbilt <ejb@ql.org>
* Improve code that finds unreferenced resources to ignore names
in the content stream that are not fonts or XObjects. This should
reduce the number of cases when qpdf needlessly decides not to
remove unreferenced resources. Hopefully it doesn't create any new
bugs where it removes unreferenced resources that it isn't
supposed to.
* Add QPDF::numWarnings() -- useful to tell whether any warnings
were issued by a specific bit of code.
2021-02-26 Jay Berkenbilt <ejb@ql.org>
* Bug fix: QPDFFormFieldObjectHelper was mis-handling /DA, /Q, and
/DR in ways that usually didn't matter but were still wrong. /DA
and /Q were being found in the field hierarchy, but if not found,
the default values in the /AcroForm dictionary were not being
used. /DR was being treated as an inherited field in the field
dictionary, which is wrong. It is actually supposed to come from
the /AcroForm dictionary. We were getting away with this since
many popular form writers seem to copy it to the field as well,
even though the spec makes no mention of doing this. To support
this, QPDFFormFieldObjectHelper::getDefaultResources was added.
2021-02-25 Jay Berkenbilt <ejb@ql.org>
* Update StreamDataProvider examples to use copyStream() when they
want to get to the original stream data from the provider. Prior
to 10.2.0, we had to copy the stream to another QPDF, but now we
can just use copyStream().
* Bug fix/behavior change: when QPDF::replaceObject or
QPDF::swapObjects is called, existing QPDFObjectHandle instances
will now notice the change. This removes a long-standing source of
bugs and confusing behavior.
2021-02-23 Jay Berkenbilt <ejb@ql.org>
* 10.2.0: release
* The test for the input and output files being the same wasn't
implemented correctly for --split-pages since the specified output
file is really a pattern, not the actual output file.
2021-02-22 Jay Berkenbilt <ejb@ql.org>
* From qpdf CLI, --pages and --split-pages will properly preserve
interactive form functionality. Fixes #340.
* Add QPDFAcroFormDocumentHelper::copyFieldsFromForeignPage to
copy form fields from a foreign page into the current file. (This
method didn't work and was deprecated in 10.3.0.)
* Add QPDFFormFieldObjectHelper::getTopLevelField to get the
top-level field for a given form field.
* Update pdf-overlay-page example to include copying of
annotations.
* Add a new version of QPDFPageObjectHelper::placeFormXObject that
initializes the transformation matrix that was used so you don't
have to call both placeFormXObject and
getMatrixForFormXObjectPlacement.
2021-02-21 Jay Berkenbilt <ejb@ql.org>
* From qpdf CLI, --overlay and --underlay will copy annotations
and form fields from overlay/underlay file. Fixes #395.
* Add QPDFPageObjectHelper::copyAnnotations, which copies
annotations and, if applicable, associated form fields, from one
page to another, possibly transforming the rectangles.
* Bug fix: --flatten-rotation now applies the required
transformation to annotations on the page.
* Add QPDFAcroFormDocumentHelper::transformAnnotations to apply a
transformation to a group of annotations.
* Add QPDFObjGen::unparse()
* Add QPDFObjectHandle::copyStream() for making a copy of a stream
within the same QPDF instance.
* Allow QPDFObjectHandle::newArray and
QPDFObjectHandle::newFromMatrix take QPDFMatrix as well as
QPDFObjectHandle::Matrix
* Make member variables a--f of QPDFMatrix public
2021-02-20 Jay Berkenbilt <ejb@ql.org>
* Allow --rotate=0 to clear rotation from a page.
2021-02-18 Jay Berkenbilt <ejb@ql.org>
* Add QPDFAcroFormDocumentHelper::addFormField, which adds a new
form field, initializing the AcroForm dictionary if needed.
* Add QPDFPageObjectHelper::getMatrixForFormXObjectPlacement,
which returns the transformation matrix required to map from a
form field's coordinate system into a specific rectangle within
the page.
* Add QUtil::path_basename to get last element of a path.
* Add examples/pdf-attach-file.cc to illustrate new file
attachment method and also new parse that takes indirect objects.
2021-02-17 Jay Berkenbilt <ejb@ql.org>
* Allow optional numeric argument to --collate. If --collate=n is
given, pull n pages from the first file, n pages from the second
file, etc., until we run out of pages.
2021-02-15 Jay Berkenbilt <ejb@ql.org>
* Add a version of QPDFObjectHandle::parse that takes a QPDF* as
context so that it can parse strings containing indirect object
references.
2021-02-14 Jay Berkenbilt <ejb@ql.org>
* Add new versions of QPDFObjectHandle::replaceStreamData that
take std::function objects for cases when you need something
between a static string and a full-fledged StreamDataProvider.
Using this with QUtil::file_provider is a very easy way to create
a stream from the contents of a file.
2021-02-12 Jay Berkenbilt <ejb@ql.org>
* Move formerly internal QPDFMatrix class to the public API. This
class provides convenience methods for working with transformation
matrices.
* QUtil::double_to_string: trim trailing zeroes by default, and
add option to not trim trailing zeroes. This causes a syntactic
but semantically preserving change in output when doubles are
converted to strings. The library uses double_to_string in only a
few places. In practice, output will be different (trailing zeroes
removed) in code that creates form XObjects (mostly generation of
appearance streams for form fields as well as overlay and
underlay) and in the flatten rotation code that was added in qpdf
10.1.
2021-02-10 Jay Berkenbilt <ejb@ql.org>
* Require a C++-14 compiler.
* Detect loops when adding when reading outlines dictionary upon
initialization of QPDFOutlineDocumentHelper (fuzz issue 30507).
* Add "attachments" as an additional json key, and add some
information about attachments to the json output.
* Add new command-line arguments for operating on attachments:
--list-attachments, --add-attachment, --remove-attachment,
--copy-attachments-from. See --help and manual for details.
2021-02-09 Jay Berkenbilt <ejb@ql.org>
* Add methods to QUtil for working with PDF timestamp strings:
pdf_time_to_qpdf_time, qpdf_time_to_pdf_time,
get_current_qpdf_time.
2021-02-08 Jay Berkenbilt <ejb@ql.org>
* Add helper classes for file attachments:
QPDFEmbeddedFileDocumentHelper, QPDFFileSpecObjectHelper,
QPDFEFStreamObjectHelper. See their header files for details.
2021-02-07 Jay Berkenbilt <ejb@ql.org>
* Add new functions QUtil::pipe_file and QUtil::file_provider for
sending the contents of a file through a pipeline as binary data.
2021-02-04 Jay Berkenbilt <ejb@ql.org>
* Add new option --password-file=file for reading the decryption
password from a file. file may be "-" to read from standard input.
Fixes #499.
* By default, give an error if a user attempts to encrypt a file
with a 256-bit key, a non-empty user password, and an empty owner
password. Such files are insecure since they can be opened with no
password. To allow explicit creation of files like this, pass the
new --allow-insecure option. Thanks to github user RobK88 for a
detailed analysis and for reporting this issue. Fixes #501.
2021-02-02 Jay Berkenbilt <ejb@ql.org>
* Bug fix: if a form XObject lacks a resources dictionary,
consider any names in that form XObject to be referenced from the
containing page. This is compliant with older PDF versions. Also
detect if any form XObjects have any unresolved names and, if so,
don't remove unreferenced resources from them or from the page
that contains them. Fixes #494.
2021-01-31 Jay Berkenbilt <ejb@ql.org>
* Bug fix: properly handle strings if they appear in inline image
dictionaries while externalizing inline images.
2021-01-30 Jay Berkenbilt <ejb@ql.org>
* Add examples/pdf-name-number-tree.cc to illustrate new
name/number tree API and new array/dictionary iterator API.
2021-01-29 Jay Berkenbilt <ejb@ql.org>
* Add methods to QPDFObjectHandle that provide a C++ iterator API,
including C++11 range-for iteration, over arrays and dictionaries.
With this, you can do
for (auto i: dict_oh.ditems())
{
// i.first is a string, i.second is a QPDFObjectHandle
}
for (auto i: array_oh.aitems())
{
// i is a QPDFObjectHandle
}
* QPDFObjectHandle::is* methods to check type now return false on
uninitialized objects rather than crashing or throwing a logic
error.
2021-01-24 Jay Berkenbilt <ejb@ql.org>
* Implement remove for name and number trees as well as exposing
remove and insertAfter methods for iterators. With this addition,
qpdf now has robust read/write support for name and number trees.
2021-01-23 Jay Berkenbilt <ejb@ql.org>
* Add an insert method to QPDFNameTreeObjectHelper and
QPDFNumberTreeObjectHelper.
* QPDFNameTreeObjectHelper and QPDFNumberTreeObjectHelper will
automatically repair broken name and number trees by default. This
behavior can be turned off.
* Change behavior of QPDFObjectHandle::newUnicodeString so that it
encodes ASCII or PDFDocEncoding if those encodings will support
all the characters in the string, resorting to UTF-16 only if the
other encodings are insufficient. This is a cleaner implementation
of the intention of encoding strings for use outside of contents
and results in fewer instances of ASCII strings being needlessly
encoded as UTF-16. This change may cause qpdf to generate
different output from the same input when form field values are
set using methods from QPDFFormFieldObjectHelper.
2021-01-16 Jay Berkenbilt <ejb@ql.org>
* Add new constructors for QPDFNameTreeObjectHelper and
QPDFNumberTreeObjectHelper that take a QPDF object so they can
create indirect objects and issue warnings. The old constructors
are deprecated and will be removed in qpdf 11. Just pass in the
owning QPDF of the object handle used to initialize the helpers.
* Re-implement QPDFNameTreeObjectHelper and
QPDFNumberTreeObjectHelper to be much more efficient and to have
an iterator-based API in addition to the existing one. This makes
it possible to use "range-for" loops over these helpers and to
iterate through name and number trees without creating a map
containing all the keys and values, which is slow and potentially
consumes a lot of memory.
* Add warn() to QPDF's public API.
2021-01-11 Jay Berkenbilt <ejb@ql.org>
* Fix very old error in code that was finding attachment streams.
Probably this error never mattered, but the code was still not
exactly right.
2021-01-06 Jay Berkenbilt <ejb@ql.org>
* Give warnings instead of segfaulting if a QPDF operation is
attempted after calling closeInputSource(). Fixes #495.
2021-01-05 Jay Berkenbilt <ejb@ql.org>
* 10.1.0: release
2021-01-04 Jay Berkenbilt <ejb@ql.org>