QPDFWriter_private.hh
8.56 KB
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
#ifndef QPDFWRITER_PRIVATE_HH
#define QPDFWRITER_PRIVATE_HH
#include <qpdf/QPDFWriter.hh>
#include <qpdf/ObjTable.hh>
#include <qpdf/Pipeline_private.hh>
#include <qpdf/QPDF.hh>
#include <qpdf/QPDFUsage.hh>
// This file is intended for inclusion by QPDFWriter, QPDF, QPDF_optimization and QPDF_linearization
// only.
namespace qpdf
{
namespace impl
{
class Writer;
}
class Writer: public QPDFWriter
{
public:
class Config
{
public:
Config() = default;
Config(Config const&) = default;
Config(Config&&) = delete;
Config& operator=(Config const&) = default;
Config& operator=(Config&&) = delete;
~Config() = default;
Config(bool permissive) :
permissive_(permissive)
{
}
bool
linearize() const
{
return linearize_;
}
Config& linearize(bool val);
std::string const&
linearize_pass1() const
{
return linearize_pass1_;
}
Config&
linearize_pass1(std::string const& val)
{
linearize_pass1_ = val;
return *this;
}
bool
preserve_encryption() const
{
return preserve_encryption_;
}
Config&
preserve_encryption(bool val)
{
preserve_encryption_ = val;
return *this;
}
bool
encrypt_use_aes() const
{
return encrypt_use_aes_;
}
Config&
encrypt_use_aes(bool val)
{
encrypt_use_aes_ = val;
return *this;
}
Config&
default_decode_level(qpdf_stream_decode_level_e val)
{
if (!decode_level_set_) {
decode_level_ = val;
}
return *this;
}
qpdf_stream_decode_level_e
decode_level() const
{
return decode_level_;
}
Config& decode_level(qpdf_stream_decode_level_e val);
qpdf_object_stream_e
object_streams() const
{
return object_streams_;
}
Config&
object_streams(qpdf_object_stream_e val)
{
object_streams_ = val;
return *this;
}
bool
compress_streams() const
{
return compress_streams_;
}
Config& compress_streams(bool val);
bool
direct_stream_lengths() const
{
return direct_stream_lengths_;
}
bool
newline_before_endstream() const
{
return newline_before_endstream_;
}
Config&
newline_before_endstream(bool val)
{
newline_before_endstream_ = val;
return *this;
}
bool
recompress_flate() const
{
return recompress_flate_;
}
Config&
recompress_flate(bool val)
{
recompress_flate_ = val;
return *this;
}
Config& stream_data(qpdf_stream_data_e val);
std::string const&
forced_pdf_version() const
{
return forced_pdf_version_;
}
Config&
forced_pdf_version(std::string const& val)
{
forced_pdf_version_ = val;
return *this;
}
Config&
forced_pdf_version(std::string const& val, int ext)
{
forced_pdf_version_ = val;
forced_extension_level_ = ext;
return *this;
}
int
forced_extension_level() const
{
return forced_extension_level_;
}
Config&
forced_extension_level(int val)
{
forced_extension_level_ = val;
return *this;
}
std::string const&
extra_header_text()
{
return extra_header_text_;
}
Config& extra_header_text(std::string const& val);
bool
preserve_unreferenced() const
{
return preserve_unreferenced_;
}
Config&
preserve_unreferenced(bool val)
{
preserve_unreferenced_ = val;
return *this;
}
bool
no_original_object_ids() const
{
return no_original_object_ids_;
}
Config&
no_original_object_ids(bool val)
{
no_original_object_ids_ = val;
return *this;
}
bool
qdf() const
{
return qdf_;
}
Config& qdf(bool val);
bool
normalize_content() const
{
return normalize_content_;
}
Config&
normalize_content(bool val)
{
normalize_content_ = val;
normalize_content_set_ = true;
return *this;
}
bool
deterministic_id() const
{
return deterministic_id_;
}
Config&
deterministic_id(bool val)
{
deterministic_id_ = val;
return *this;
}
bool
static_id() const
{
return static_id_;
}
Config&
static_id(bool val)
{
static_id_ = val;
return *this;
}
bool
pclm() const
{
return pclm_;
}
Config& pclm(bool val);
private:
void
usage(std::string const& msg) const
{
if (!permissive_) {
throw QPDFUsage(msg);
}
}
std::string forced_pdf_version_;
std::string extra_header_text_;
// For linearization only
std::string linearize_pass1_;
qpdf_object_stream_e object_streams_{qpdf_o_preserve};
qpdf_stream_decode_level_e decode_level_{qpdf_dl_generalized};
int forced_extension_level_{0};
bool normalize_content_set_{false};
bool normalize_content_{false};
bool compress_streams_{true};
bool compress_streams_set_{false};
bool decode_level_set_{false};
bool recompress_flate_{false};
bool qdf_{false};
bool preserve_unreferenced_{false};
bool newline_before_endstream_{false};
bool deterministic_id_{false};
bool static_id_{false};
bool no_original_object_ids_{false};
bool direct_stream_lengths_{true};
bool preserve_encryption_{true};
bool linearize_{false};
bool pclm_{false};
bool encrypt_use_aes_{false};
bool permissive_{true};
}; // class Writer::Config
Writer() = delete;
Writer(Writer const&) = delete;
Writer(Writer&&) = delete;
Writer& operator=(Writer const&) = delete;
Writer& operator=(Writer&&) = delete;
~Writer() = default;
Writer(QPDF& qpdf, Config cfg);
}; // class Writer
} // namespace qpdf
struct QPDFWriter::Object
{
int renumber{0};
int gen{0};
int object_stream{0};
};
struct QPDFWriter::NewObject
{
QPDFXRefEntry xref;
qpdf_offset_t length{0};
};
class QPDFWriter::ObjTable: public ::ObjTable<QPDFWriter::Object>
{
friend class qpdf::impl::Writer;
public:
bool
getStreamsEmpty() const noexcept
{
return streams_empty;
}
private:
// For performance, set by QPDFWriter rather than tracked by ObjTable.
bool streams_empty{false};
};
class QPDFWriter::NewObjTable: public ::ObjTable<QPDFWriter::NewObject>
{
friend class QPDFWriter;
};
#endif // QPDFWRITER_PRIVATE_HH