7#include "public/fpdf_ppo.h"
14#include "core/fpdfapi/edit/cpdf_npagetooneexporter.h"
15#include "core/fpdfapi/edit/cpdf_pageexporter.h"
16#include "core/fpdfapi/page/cpdf_form.h"
17#include "core/fpdfapi/page/cpdf_formobject.h"
18#include "core/fpdfapi/page/cpdf_page.h"
19#include "core/fpdfapi/page/cpdf_pageimagecache.h"
20#include "core/fpdfapi/page/cpdf_pageobject.h"
21#include "core/fpdfapi/parser/cpdf_array.h"
22#include "core/fpdfapi/parser/cpdf_dictionary.h"
23#include "core/fpdfapi/parser/cpdf_document.h"
24#include "core/fpdfapi/parser/cpdf_object.h"
25#include "core/fpdfapi/parser/fpdf_parser_utility.h"
26#include "core/fxcrt/check.h"
27#include "core/fxcrt/retain_ptr.h"
28#include "core/fxcrt/span.h"
29#include "fpdfsdk/cpdfsdk_helpers.h"
30#include "public/cpp/fpdf_scopers.h"
37 if (!page_range.IsEmpty()) {
38 return ParsePageRangeString(page_range, count);
41 std::vector<uint32_t> page_indices(count);
42 std::iota(page_indices.begin(), page_indices.end(), 0);
48bool IsValidViewerPreferencesArray(
const CPDF_Array* array) {
50 for (
const auto& obj : locker) {
51 if (obj->IsArray() || obj->IsDictionary() || obj->IsReference() ||
59bool IsValidViewerPreferencesObject(
const CPDF_Object* obj) {
71 return IsValidViewerPreferencesArray(array);
78 FPDF_DOCUMENT src_doc,
79 const int* page_indices,
92 CPDF_PageExporter exporter
(cdest_doc
, csrc_doc
);
96 std::iota(page_indices_vec.begin(), page_indices_vec.end(), 0);
97 return exporter.ExportPages(page_indices_vec, index);
105 for (
int page_index : page_span) {
106 if (page_index < 0) {
110 return exporter.ExportPages(
111 fxcrt::reinterpret_span<
const uint32_t>(page_span), index);
115 FPDF_DOCUMENT src_doc,
116 FPDF_BYTESTRING pagerange,
128 std::vector<uint32_t> page_indices = GetPageIndices(*csrc_doc, pagerange);
129 if (page_indices.empty())
132 CPDF_PageExporter exporter
(cdest_doc
, csrc_doc
);
133 return exporter.ExportPages(page_indices, index);
140 size_t pages_on_x_axis,
141 size_t pages_on_y_axis) {
147 if (output_width <= 0 || output_height <= 0 || pages_on_x_axis <= 0 ||
148 pages_on_y_axis <= 0) {
156 CPDF_Document* dest_doc = CPDFDocumentFromFPDFDocument(output_doc.get());
159 std::vector<uint32_t> page_indices = GetPageIndices(*csrc_doc, ByteString());
160 if (page_indices.empty())
163 if (pages_on_x_axis == 1 && pages_on_y_axis == 1) {
164 CPDF_PageExporter exporter
(dest_doc
, csrc_doc
);
165 if (!exporter.ExportPages(page_indices, 0)) {
168 return output_doc.release();
171 CPDF_NPageToOneExporter exporter
(dest_doc
, csrc_doc
);
172 if (!exporter.ExportNPagesToOne(page_indices,
173 CFX_SizeF(output_width, output_height),
174 pages_on_x_axis, pages_on_y_axis)) {
177 return output_doc.release();
182 FPDF_DOCUMENT src_doc,
183 int src_page_index) {
192 CPDF_NPageToOneExporter exporter
(dest
, src
);
193 std::unique_ptr<XObjectContext> xobject =
194 exporter.CreateXObjectContextFromPage(src_page_index);
195 return FPDFXObjectFromXObjectContext(xobject.release());
199 std::unique_ptr<XObjectContext> xobject_deleter(
209 auto form =
std::make_unique<CPDF_Form>(xobj->dest_doc,
nullptr,
210 xobj->xobject,
nullptr);
211 form->ParseContent(
nullptr,
nullptr,
nullptr);
212 auto form_object =
std::make_unique<CPDF_FormObject>(
214 return FPDFPageObjectFromCPDFPageObject(form_object.release());
230 csrc_doc->GetRoot()->GetDictFor(
"ViewerPreferences");
242 for (
const auto& it : locker) {
243 if (IsValidViewerPreferencesObject(it.second)) {
244 cloned_dict->SetFor(it.first, it.second->Clone());
248 dest_dict->SetFor(
"ViewerPreferences",
std::move(cloned_dict));
fxcrt::ByteString ByteString
constexpr CFX_Matrix()=default
CPDF_ArrayLocker(const CPDF_Array *pArray)
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
CPDF_NPageToOneExporter(CPDF_Document *dest_doc, CPDF_Document *src_doc)
bool IsDictionary() const
const CPDF_Array * AsArray() const
CPDF_PageExporter(CPDF_Document *dest_doc, CPDF_Document *src_doc)
static constexpr int32_t kNoContentStream
#define UNSAFE_BUFFERS(...)
XObjectContext * XObjectContextFromFPDFXObject(FPDF_XOBJECT xobject)
CPDF_Document * CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc)
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_CreateNewDocument()
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_ImportNPagesToOne(FPDF_DOCUMENT src_doc, float output_width, float output_height, size_t pages_on_x_axis, size_t pages_on_y_axis)
FPDF_EXPORT void FPDF_CALLCONV FPDF_CloseXObject(FPDF_XOBJECT xobject)
FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV FPDF_NewFormObjectFromXObject(FPDF_XOBJECT xobject)
FPDF_EXPORT FPDF_XOBJECT FPDF_CALLCONV FPDF_NewXObjectFromPage(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc, int src_page_index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_ImportPages(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc, FPDF_BYTESTRING pagerange, int index)
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_ImportPagesByIndex(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc, const int *page_indices, unsigned long length, int index)