Skip to content
This repository was archived by the owner on Nov 10, 2025. It is now read-only.

Commit 3488428

Browse files
author
Arnaud Delubac
committed
adding option to display pdf in dual mode and the isLandscape property
1 parent d243b39 commit 3488428

File tree

6 files changed

+75
-9
lines changed

6 files changed

+75
-9
lines changed

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/DecodingAsyncTask.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ protected Throwable doInBackground(Void... params) {
5252
if (pdfView != null) {
5353
PdfDocument pdfDocument = docSource.createDocument(pdfView.getContext(), pdfiumCore, password);
5454
pdfFile = new PdfFile(pdfiumCore, pdfDocument, pdfView.getPageFitPolicy(), getViewSize(pdfView),
55-
userPages, pdfView.isSwipeVertical(), pdfView.getSpacingPx(), pdfView.isAutoSpacingEnabled(),
56-
pdfView.isFitEachPage());
55+
userPages, pdfView.isOnDualPageMode(), pdfView.isSwipeVertical(), pdfView.getSpacingPx(), pdfView.isAutoSpacingEnabled(),
56+
pdfView.isFitEachPage(), pdfView.isOnLandscapeOrientation());
5757
return null;
5858
} else {
5959
return new NullPointerException("pdfView == null");

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ enum ScrollDir {
176176

177177
private int defaultPage = 0;
178178

179+
private boolean dualPageMode = false;
180+
181+
private boolean isLandscapeOrientation = false;
182+
179183
/** True if should scroll through pages vertically instead of horizontally */
180184
private boolean swipeVertical = true;
181185

@@ -1179,6 +1183,18 @@ public boolean isBestQuality() {
11791183
return bestQuality;
11801184
}
11811185

1186+
public boolean isOnDualPageMode() {
1187+
return dualPageMode;
1188+
}
1189+
1190+
public boolean isOnLandscapeOrientation() { return isLandscapeOrientation; }
1191+
1192+
public void setLandscapeOrientation(boolean landscapeOrientation) {this.isLandscapeOrientation = landscapeOrientation; }
1193+
1194+
public void setDualPageMode(boolean dualPageMode) {
1195+
this.dualPageMode = dualPageMode;
1196+
}
1197+
11821198
public boolean isSwipeVertical() {
11831199
return swipeVertical;
11841200
}
@@ -1353,6 +1369,10 @@ public class Configurator {
13531369

13541370
private int defaultPage = 0;
13551371

1372+
private boolean landscapeOrientation = false;
1373+
1374+
private boolean dualPageMode = false;
1375+
13561376
private boolean swipeHorizontal = false;
13571377

13581378
private boolean annotationRendering = false;
@@ -1461,6 +1481,16 @@ public Configurator defaultPage(int defaultPage) {
14611481
return this;
14621482
}
14631483

1484+
public Configurator landscapeOrientation(boolean landscapeOrientation) {
1485+
this.landscapeOrientation = landscapeOrientation;
1486+
return this;
1487+
}
1488+
1489+
public Configurator dualPageMode(boolean dualPageMode) {
1490+
this.dualPageMode = dualPageMode;
1491+
return this;
1492+
}
1493+
14641494
public Configurator swipeHorizontal(boolean swipeHorizontal) {
14651495
this.swipeHorizontal = swipeHorizontal;
14661496
return this;
@@ -1542,6 +1572,8 @@ public void load() {
15421572
PDFView.this.setNightMode(nightMode);
15431573
PDFView.this.enableDoubletap(enableDoubletap);
15441574
PDFView.this.setDefaultPage(defaultPage);
1575+
PDFView.this.setLandscapeOrientation(landscapeOrientation);
1576+
PDFView.this.setDualPageMode(dualPageMode);
15451577
PDFView.this.setSwipeVertical(!swipeHorizontal);
15461578
PDFView.this.enableAnnotationRendering(annotationRendering);
15471579
PDFView.this.setScrollHandle(scrollHandle);

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class PdfFile {
5151
private SizeF maxHeightPageSize = new SizeF(0, 0);
5252
/** Scaled page with maximum width */
5353
private SizeF maxWidthPageSize = new SizeF(0, 0);
54+
/** True if dualPageMode is on*/
55+
private boolean showTwoPages;
5456
/** True if scrolling is vertical, else it's horizontal */
5557
private boolean isVertical;
5658
/** Fixed spacing between pages in pixels */
@@ -69,14 +71,17 @@ class PdfFile {
6971
* else the largest page fits and other pages scale relatively
7072
*/
7173
private final boolean fitEachPage;
74+
75+
private final boolean isLandscape;
7276
/**
7377
* The pages the user want to display in order
7478
* (ex: 0, 2, 2, 8, 8, 1, 1, 1)
7579
*/
7680
private int[] originalUserPages;
7781

7882
PdfFile(PdfiumCore pdfiumCore, PdfDocument pdfDocument, FitPolicy pageFitPolicy, Size viewSize, int[] originalUserPages,
79-
boolean isVertical, int spacing, boolean autoSpacing, boolean fitEachPage) {
83+
boolean showTwoPages, boolean isVertical, int spacing, boolean autoSpacing, boolean fitEachPage, boolean isLandscape) {
84+
this.showTwoPages = showTwoPages;
8085
this.pdfiumCore = pdfiumCore;
8186
this.pdfDocument = pdfDocument;
8287
this.pageFitPolicy = pageFitPolicy;
@@ -85,6 +90,7 @@ class PdfFile {
8590
this.spacingPx = spacing;
8691
this.autoSpacing = autoSpacing;
8792
this.fitEachPage = fitEachPage;
93+
this.isLandscape = isLandscape;
8894
setup(viewSize);
8995
}
9096

@@ -122,7 +128,7 @@ public void recalculatePageSizes(Size viewSize) {
122128
maxHeightPageSize = calculator.getOptimalMaxHeightPageSize();
123129

124130
for (Size size : originalPageSizes) {
125-
pageSizes.add(calculator.calculate(size));
131+
pageSizes.add(calculator.calculate(size, showTwoPages, isLandscape));
126132
}
127133
if (autoSpacing) {
128134
prepareAutoSpacing(viewSize);

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,11 @@ private void calculateMiddle() {
149149
pos = getY();
150150
viewSize = getHeight();
151151
pdfViewSize = pdfView.getHeight();
152-
} else {
152+
} else if (pdfView.isOnDualPageMode()){
153+
pos = getX();
154+
viewSize = getWidth() / 2;
155+
pdfViewSize = pdfView.getWidth() / 2;
156+
} else {
153157
pos = getX();
154158
viewSize = getWidth();
155159
pdfViewSize = pdfView.getWidth();

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package com.github.barteksc.pdfviewer.util;
1717

18+
import android.app.Activity;
19+
import android.util.Log;
20+
import android.content.pm.ActivityInfo;
1821
import com.shockwave.pdfium.util.Size;
1922
import com.shockwave.pdfium.util.SizeF;
2023

@@ -40,11 +43,16 @@ public PageSizeCalculator(FitPolicy fitPolicy, Size originalMaxWidthPageSize, Si
4043
calculateMaxPages();
4144
}
4245

43-
public SizeF calculate(Size pageSize) {
46+
public SizeF calculate(Size pageSize, boolean showTwoPages, boolean isLandscape) {
4447
if (pageSize.getWidth() <= 0 || pageSize.getHeight() <= 0) {
4548
return new SizeF(0, 0);
4649
}
47-
float maxWidth = fitEachPage ? viewSize.getWidth() : pageSize.getWidth() * widthRatio;
50+
float maxWidth = 0;
51+
if(showTwoPages && !isLandscape){
52+
maxWidth = fitEachPage ? viewSize.getWidth() : pageSize.getWidth() / 2 * widthRatio;
53+
} else {
54+
maxWidth = fitEachPage ? viewSize.getWidth() : pageSize.getWidth() * widthRatio;
55+
}
4856
float maxHeight = fitEachPage ? viewSize.getHeight() : pageSize.getHeight() * heightRatio;
4957
switch (fitPolicy) {
5058
case HEIGHT:

sample/src/main/java/com/github/barteksc/sample/PDFViewActivity.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import android.content.ActivityNotFoundException;
1919
import android.content.Intent;
2020
import android.content.pm.PackageManager;
21+
import android.content.res.Configuration;
2122
import android.database.Cursor;
2223
import android.graphics.Color;
2324
import android.net.Uri;
@@ -71,6 +72,8 @@ public class PDFViewActivity extends AppCompatActivity implements OnPageChangeLi
7172

7273
String pdfFileName;
7374

75+
76+
7477
@OptionsItem(R.id.pickFile)
7578
void pickFile() {
7679
int permissionCheck = ContextCompat.checkSelfPermission(this,
@@ -112,15 +115,24 @@ void afterViews() {
112115
}
113116

114117
private void displayFromAsset(String assetFileName) {
118+
boolean isLandscape = false;
119+
int orientation = this.getResources().getConfiguration().orientation;
120+
isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE;
115121
pdfFileName = assetFileName;
116122

117123
pdfView.fromAsset(SAMPLE_FILE)
118124
.defaultPage(pageNumber)
119125
.onPageChange(this)
120126
.enableAnnotationRendering(true)
121127
.onLoad(this)
128+
.landscapeOrientation(isLandscape)
129+
.dualPageMode(true)
122130
.scrollHandle(new DefaultScrollHandle(this))
123-
.spacing(10) // in dp
131+
.spacing(0) // in dp
132+
.enableSwipe(true)
133+
.swipeHorizontal(true)
134+
.pageFling(true)
135+
.fitEachPage(false)
124136
.onPageError(this)
125137
.pageFitPolicy(FitPolicy.BOTH)
126138
.load();
@@ -135,7 +147,11 @@ private void displayFromUri(Uri uri) {
135147
.enableAnnotationRendering(true)
136148
.onLoad(this)
137149
.scrollHandle(new DefaultScrollHandle(this))
138-
.spacing(10) // in dp
150+
.spacing(0) // in dp
151+
.dualPageMode(true)
152+
.enableSwipe(true)
153+
.swipeHorizontal(true)
154+
.pageFling(true)
139155
.onPageError(this)
140156
.load();
141157
}

0 commit comments

Comments
 (0)