Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
fpdf_save_embeddertest.cpp
Go to the documentation of this file.
1// Copyright 2016 The PDFium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6
7#include "core/fxcrt/fx_string.h"
8#include "public/cpp/fpdf_scopers.h"
9#include "public/fpdf_edit.h"
10#include "public/fpdf_ppo.h"
11#include "public/fpdf_save.h"
12#include "public/fpdfview.h"
13#include "testing/embedder_test.h"
14#include "testing/embedder_test_constants.h"
15#include "testing/gmock/include/gmock/gmock-matchers.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18using testing::HasSubstr;
19using testing::Not;
20using testing::StartsWith;
21
23
25 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
26 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
27 EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\r\n"));
28 EXPECT_EQ(805u, GetString().size());
29}
30
32 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
33 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 14));
34 EXPECT_THAT(GetString(), StartsWith("%PDF-1.4\r\n"));
35 EXPECT_EQ(805u, GetString().size());
36}
37
39 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
40 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, -1));
41 EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\r\n"));
42
43 ClearString();
44 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 0));
45 EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\r\n"));
46
47 ClearString();
48 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 18));
49 EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\r\n"));
50}
51
53 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
54 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, FPDF_INCREMENTAL, 14));
55 // Version gets taken as-is from input document.
56 EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\n%\xa0\xf2\xa4\xf4"));
57 // Additional output produced vs. non incremental.
58 EXPECT_EQ(985u, GetString().size());
59}
60
62 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
63 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, FPDF_NO_INCREMENTAL, 14));
64 EXPECT_THAT(GetString(), StartsWith("%PDF-1.4\r\n"));
65 EXPECT_EQ(805u, GetString().size());
66}
67
69 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
70 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, FPDF_REMOVE_SECURITY, 14));
71 EXPECT_THAT(GetString(), StartsWith("%PDF-1.4\r\n"));
72 EXPECT_EQ(805u, GetString().size());
73}
74
76 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
77 EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 999999, 14));
78 EXPECT_THAT(GetString(), StartsWith("%PDF-1.4\r\n"));
79 EXPECT_EQ(805u, GetString().size());
80}
81
83 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
84
85 FPDF_PAGE page = LoadPage(0);
86 EXPECT_TRUE(page);
87
88 ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
89 EXPECT_TRUE(output_doc);
90 EXPECT_TRUE(FPDF_ImportPages(output_doc.get(), document(), "1", 0));
91 EXPECT_TRUE(FPDF_SaveAsCopy(output_doc.get(), this, 0));
92
93 UnloadPage(page);
94}
95
97 const int kPageCount = 3;
98 std::string original_md5[kPageCount];
99
100 ASSERT_TRUE(OpenDocument("linearized.pdf"));
101 for (int i = 0; i < kPageCount; ++i) {
102 FPDF_PAGE page = LoadPage(i);
103 ASSERT_TRUE(page);
104 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
105 EXPECT_EQ(612, FPDFBitmap_GetWidth(bitmap.get()));
106 EXPECT_EQ(792, FPDFBitmap_GetHeight(bitmap.get()));
107 original_md5[i] = HashBitmap(bitmap.get());
108 UnloadPage(page);
109 }
110
111 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
112 EXPECT_THAT(GetString(), StartsWith("%PDF-1.6\r\n"));
113 EXPECT_THAT(GetString(), HasSubstr("/Root "));
114 EXPECT_THAT(GetString(), HasSubstr("/Info "));
115 EXPECT_THAT(GetString(), HasSubstr("/Size 37"));
116 EXPECT_THAT(GetString(), HasSubstr("35 0 obj"));
117 EXPECT_THAT(GetString(), HasSubstr("36 0 obj"));
118 EXPECT_THAT(GetString(), Not(HasSubstr("37 0 obj")));
119 EXPECT_THAT(GetString(), Not(HasSubstr("38 0 obj")));
120 EXPECT_EQ(7908u, GetString().size());
121
122 // Make sure new document renders the same as the old one.
123 ASSERT_TRUE(OpenSavedDocument());
124 for (int i = 0; i < kPageCount; ++i) {
125 FPDF_PAGE page = LoadSavedPage(i);
126 ASSERT_TRUE(page);
127 ScopedFPDFBitmap bitmap = RenderSavedPage(page);
128 EXPECT_EQ(original_md5[i], HashBitmap(bitmap.get()));
129 CloseSavedPage(page);
130 }
131 CloseSavedDocument();
132}
133
135 ASSERT_TRUE(OpenDocument("jpx_lzw.pdf"));
136 FPDF_PAGE page = LoadPage(0);
137 ASSERT_TRUE(page);
138 while (FPDFPage_CountObjects(page) > 0) {
139 ScopedFPDFPageObject object(FPDFPage_GetObject(page, 0));
140 ASSERT_TRUE(object);
141 ASSERT_TRUE(FPDFPage_RemoveObject(page, object.get()));
142 }
143 ASSERT_TRUE(FPDFPage_GenerateContent(page));
144 UnloadPage(page);
145
146 ASSERT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
147
148 // The new document should render as empty.
149 ASSERT_TRUE(OpenSavedDocument());
150 FPDF_PAGE saved_page = LoadSavedPage(0);
151 ASSERT_TRUE(saved_page);
152 ScopedFPDFBitmap bitmap = RenderSavedPage(saved_page);
153 EXPECT_EQ(pdfium::kBlankPage612By792Checksum, HashBitmap(bitmap.get()));
154 CloseSavedPage(saved_page);
155 CloseSavedDocument();
156
157 EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\r\n"));
158 EXPECT_THAT(GetString(), HasSubstr("/Root "));
159 EXPECT_THAT(GetString(), Not(HasSubstr("/Image")));
160 EXPECT_LT(GetString().size(), 600u);
161}
162
163#ifdef PDF_ENABLE_XFA
164TEST_F(FPDFSaveEmbedderTest, SaveXFADoc) {
165 ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
166 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
167 EXPECT_THAT(GetString(), StartsWith("%PDF-1.7\r\n"));
168 ASSERT_TRUE(OpenSavedDocument());
169 // TODO(tsepez): check for XFA forms in document
170 CloseSavedDocument();
171}
172#endif // PDF_ENABLE_XFA
173
175 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
176 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
177 EXPECT_THAT(GetString(), HasSubstr("0000000000 65535 f\r\n"));
178 EXPECT_THAT(GetString(), Not(HasSubstr("0000000000 65536 f\r\n")));
179}
180
182 ASSERT_TRUE(OpenDocument("bug_905142.pdf"));
183 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
184 EXPECT_THAT(GetString(), HasSubstr("/Length 0"));
185}
186
187// Should not trigger a DCHECK() failure in CFX_FileBufferArchive.
188// Fails because the PDF is malformed.
190 ASSERT_TRUE(OpenDocument("bug_1328389.pdf"));
191 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
192 EXPECT_THAT(GetString(), HasSubstr("/Foo/"));
193}
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPage_GenerateContent(FPDF_PAGE page)
FPDF_EXPORT int FPDF_CALLCONV FPDFPage_CountObjects(FPDF_PAGE page)
#define FPDF_INCREMENTAL
Definition fpdf_save.h:45
#define FPDF_REMOVE_SECURITY
Definition fpdf_save.h:47
#define FPDF_NO_INCREMENTAL
Definition fpdf_save.h:46
TEST_F(FPDFSaveEmbedderTest, SaveSimpleDoc)
const char kBlankPage612By792Checksum[]