23
23
import java .io .File ;
24
24
import java .io .IOException ;
25
25
26
+ import com .tom_roush .pdfbox .android .PDFBoxResourceLoader ;
26
27
import com .tom_roush .pdfbox .io .MemoryUsageSetting ;
27
28
import com .tom_roush .pdfbox .pdmodel .PDDocument ;
29
+ import com .tom_roush .pdfbox .pdmodel .PDDocumentCatalog ;
30
+ import com .tom_roush .pdfbox .pdmodel .PDPage ;
31
+ import com .tom_roush .pdfbox .pdmodel .interactive .documentnavigation .destination .PDPageDestination ;
32
+ import com .tom_roush .pdfbox .pdmodel .interactive .documentnavigation .destination .PDPageFitDestination ;
28
33
import com .tom_roush .pdfbox .rendering .PDFRenderer ;
29
- import com .tom_roush .pdfbox .android .PDFBoxResourceLoader ;
30
-
31
- import org .junit .Before ;
32
- import org .junit .Test ;
33
34
34
- import static org . junit .Assert . assertEquals ;
35
+ import junit .framework . TestCase ;
35
36
36
37
/**
37
38
* Test suite for PDFMergerUtility.
38
39
*
39
40
* @author Maruan Sahyoun (PDF files)
40
41
* @author Tilman Hausherr (code)
41
42
*/
42
- public class PDFMergerUtilityTest
43
+ public class PDFMergerUtilityTest extends TestCase
43
44
{
44
45
final String SRCDIR = "pdfbox/input/merge" ;
45
46
String TARGETTESTDIR ;
46
47
final int DPI = 96 ;
47
- Context testContext ;
48
+ private Context testContext ;
48
49
49
- @ Before
50
- public void setUp () throws Exception
50
+ @ Override
51
+ protected void setUp () throws Exception
51
52
{
53
+ super .setUp ();
54
+
52
55
testContext = InstrumentationRegistry .getInstrumentation ().getContext ();
53
56
PDFBoxResourceLoader .init (testContext );
54
57
TARGETTESTDIR = testContext .getCacheDir () + "/pdfbox-test-output/merge/" ;
58
+
55
59
new File (TARGETTESTDIR ).mkdirs ();
56
60
if (!new File (TARGETTESTDIR ).exists ())
57
61
{
58
62
throw new IOException ("could not create output directory" );
59
63
}
60
64
}
61
65
66
+
67
+
62
68
/**
63
69
* Tests whether the merge of two PDF files with identically named but
64
70
* different global resources works. The two PDF files have two fonts each
@@ -69,17 +75,18 @@ public void setUp() throws Exception
69
75
*
70
76
* @throws IOException if something goes wrong.
71
77
*/
72
- @ Test
73
78
public void testPDFMergerUtility () throws IOException
74
79
{
75
80
checkMergeIdentical ("PDFBox.GlobalResourceMergeTest.Doc01.decoded.pdf" ,
76
81
"PDFBox.GlobalResourceMergeTest.Doc02.decoded.pdf" ,
77
- "GlobalResourceMergeTestResult.pdf" , MemoryUsageSetting .setupMainMemoryOnly ());
82
+ "GlobalResourceMergeTestResult.pdf" ,
83
+ MemoryUsageSetting .setupMainMemoryOnly ());
78
84
79
85
// once again, with scratch file
80
86
checkMergeIdentical ("PDFBox.GlobalResourceMergeTest.Doc01.decoded.pdf" ,
81
87
"PDFBox.GlobalResourceMergeTest.Doc02.decoded.pdf" ,
82
- "GlobalResourceMergeTestResult2.pdf" , MemoryUsageSetting .setupTempFileOnly ());
88
+ "GlobalResourceMergeTestResult2.pdf" ,
89
+ MemoryUsageSetting .setupTempFileOnly ());
83
90
}
84
91
85
92
/**
@@ -91,34 +98,77 @@ public void testPDFMergerUtility() throws IOException
91
98
*/
92
99
public void testJpegCcitt () throws IOException
93
100
{
94
- checkMergeIdentical ("jpegrgb.pdf" , "multitiff.pdf" , "JpegMultiMergeTestResult.pdf" ,
101
+ checkMergeIdentical ("jpegrgb.pdf" ,
102
+ "multitiff.pdf" ,
103
+ "JpegMultiMergeTestResult.pdf" ,
95
104
MemoryUsageSetting .setupMainMemoryOnly ());
96
105
97
106
// once again, with scratch file
98
- checkMergeIdentical ("jpegrgb.pdf" , "multitiff.pdf" , "JpegMultiMergeTestResult.pdf" ,
107
+ checkMergeIdentical ("jpegrgb.pdf" ,
108
+ "multitiff.pdf" ,
109
+ "JpegMultiMergeTestResult.pdf" ,
99
110
MemoryUsageSetting .setupTempFileOnly ());
100
111
}
101
112
102
113
// see PDFBOX-2893
103
- @ Test
104
114
public void testPDFMergerUtility2 () throws IOException
105
115
{
106
116
checkMergeIdentical ("PDFBox.GlobalResourceMergeTest.Doc01.pdf" ,
107
117
"PDFBox.GlobalResourceMergeTest.Doc02.pdf" ,
108
- "GlobalResourceMergeTestResult.pdf" , MemoryUsageSetting .setupMainMemoryOnly ());
118
+ "GlobalResourceMergeTestResult.pdf" ,
119
+ MemoryUsageSetting .setupMainMemoryOnly ());
109
120
110
121
// once again, with scratch file
111
122
checkMergeIdentical ("PDFBox.GlobalResourceMergeTest.Doc01.pdf" ,
112
123
"PDFBox.GlobalResourceMergeTest.Doc02.pdf" ,
113
- "GlobalResourceMergeTestResult2.pdf" , MemoryUsageSetting .setupTempFileOnly ());
124
+ "GlobalResourceMergeTestResult2.pdf" ,
125
+ MemoryUsageSetting .setupTempFileOnly ());
126
+ }
127
+
128
+ /**
129
+ * PDFBOX-3972: Test that OpenAction page destination isn't lost after merge.
130
+ *
131
+ * @throws IOException
132
+ */
133
+ public void testPDFMergerOpenAction () throws IOException
134
+ {
135
+ PDDocument doc1 = new PDDocument ();
136
+ doc1 .addPage (new PDPage ());
137
+ doc1 .addPage (new PDPage ());
138
+ doc1 .addPage (new PDPage ());
139
+ doc1 .save (new File (TARGETTESTDIR ,"MergerOpenActionTest1.pdf" ));
140
+ doc1 .close ();
141
+
142
+ PDDocument doc2 = new PDDocument ();
143
+ doc2 .addPage (new PDPage ());
144
+ doc2 .addPage (new PDPage ());
145
+ doc2 .addPage (new PDPage ());
146
+ PDPageDestination dest = new PDPageFitDestination ();
147
+ dest .setPage (doc2 .getPage (1 ));
148
+ doc2 .getDocumentCatalog ().setOpenAction (dest );
149
+ doc2 .save (new File (TARGETTESTDIR ,"MergerOpenActionTest2.pdf" ));
150
+ doc2 .close ();
151
+
152
+ PDFMergerUtility pdfMergerUtility = new PDFMergerUtility ();
153
+ pdfMergerUtility .addSource (new File (TARGETTESTDIR , "MergerOpenActionTest1.pdf" ));
154
+ pdfMergerUtility .addSource (new File (TARGETTESTDIR , "MergerOpenActionTest2.pdf" ));
155
+ pdfMergerUtility .setDestinationFileName (TARGETTESTDIR + "MergerOpenActionTestResult.pdf" );
156
+ pdfMergerUtility .mergeDocuments (MemoryUsageSetting .setupMainMemoryOnly ());
157
+
158
+ PDDocument mergedDoc = PDDocument .load (new File (TARGETTESTDIR , "MergerOpenActionTestResult.pdf" ));
159
+ PDDocumentCatalog documentCatalog = mergedDoc .getDocumentCatalog ();
160
+ dest = (PDPageDestination ) documentCatalog .getOpenAction ();
161
+ assertEquals (4 , documentCatalog .getPages ().indexOf (dest .getPage ()));
162
+ mergedDoc .close ();
114
163
}
115
164
116
165
// checks that the result file of a merge has the same rendering as the two
117
166
// source files
118
167
private void checkMergeIdentical (String filename1 , String filename2 , String mergeFilename ,
119
- MemoryUsageSetting memUsageSetting ) throws IOException
168
+ MemoryUsageSetting memUsageSetting )
169
+ throws IOException
120
170
{
121
- PDDocument srcDoc1 = PDDocument .load (testContext .getAssets ().open (SRCDIR + "/" + filename1 ), (String ) null );
171
+ PDDocument srcDoc1 = PDDocument .load (testContext .getAssets ().open (SRCDIR + "/" + filename1 ), (String )null );
122
172
int src1PageCount = srcDoc1 .getNumberOfPages ();
123
173
PDFRenderer src1PdfRenderer = new PDFRenderer (srcDoc1 );
124
174
Bitmap [] src1ImageTab = new Bitmap [src1PageCount ];
@@ -128,7 +178,7 @@ private void checkMergeIdentical(String filename1, String filename2, String merg
128
178
}
129
179
srcDoc1 .close ();
130
180
131
- PDDocument srcDoc2 = PDDocument .load (testContext .getAssets ().open (SRCDIR + "/" + filename2 ), (String ) null );
181
+ PDDocument srcDoc2 = PDDocument .load (testContext .getAssets ().open (SRCDIR + "/" + filename2 ), (String )null );
132
182
int src2PageCount = srcDoc2 .getNumberOfPages ();
133
183
PDFRenderer src2PdfRenderer = new PDFRenderer (srcDoc2 );
134
184
Bitmap [] src2ImageTab = new Bitmap [src2PageCount ];
@@ -145,7 +195,7 @@ private void checkMergeIdentical(String filename1, String filename2, String merg
145
195
pdfMergerUtility .mergeDocuments (memUsageSetting );
146
196
147
197
PDDocument mergedDoc
148
- = PDDocument .load (new File (TARGETTESTDIR , mergeFilename ), (String ) null );
198
+ = PDDocument .load (new File (TARGETTESTDIR , mergeFilename ), (String )null );
149
199
PDFRenderer mergePdfRenderer = new PDFRenderer (mergedDoc );
150
200
int mergePageCount = mergedDoc .getNumberOfPages ();
151
201
assertEquals (src1PageCount + src2PageCount , mergePageCount );
@@ -169,14 +219,13 @@ private void checkImagesIdentical(Bitmap bim1, Bitmap bim2)
169
219
assertEquals (bim1 .getWidth (), bim2 .getWidth ());
170
220
int w = bim1 .getWidth ();
171
221
int h = bim1 .getHeight ();
172
-
173
- int [] bim1Pixels = new int [w * h ];
174
- bim1 .getPixels (bim1Pixels , 0 , w , 0 , 0 , w , h );
175
- int [] bim2Pixels = new int [w * h ];
176
- bim2 .getPixels (bim2Pixels , 0 , w , 0 , 0 , w , h );
177
- for (int pixelIdx = 0 ; pixelIdx < w * h ; pixelIdx ++)
222
+ for (int i = 0 ; i < w ; ++i )
178
223
{
179
- assertEquals (bim1Pixels [pixelIdx ], bim2Pixels [pixelIdx ]);
224
+ for (int j = 0 ; j < h ; ++j )
225
+ {
226
+ assertEquals (bim1 .getPixel (i , j ), bim2 .getPixel (i , j ));
227
+ }
180
228
}
181
229
}
230
+
182
231
}
0 commit comments