• R/O
  • SSH
  • HTTPS

util: Commit


Commit MetaInfo

Revision248 (tree)
Time2022-08-21 13:18:27
Authorhirukawa_ryo

Log Message

* fx-pdf 0.2.9
rotation が 270 に設定されている用紙が横方向に長い PDF が正しく表示されないバグを修正しました。
rotation が 180 で割り切れない場合は用紙の向きが異なるものとして用紙の縦と横の長さを入れ替えて処理するようにしました。
0.2.7 で廃止していた PdfView の renderScaleProperty と renderBounds を復活させました。(JPKI PDF SIGNERで使っていました)
依存ライブラリ pdfbox 2.0.24 -> 2.0.26
Gradle 7.0.2 -> 7.5.1

Change Summary

Incremental Difference

--- fx-pdf/trunk/src/main/java/net/osdn/util/javafx/scene/control/pdf/PdfView.java (revision 247)
+++ fx-pdf/trunk/src/main/java/net/osdn/util/javafx/scene/control/pdf/PdfView.java (revision 248)
@@ -1,9 +1,13 @@
11 package net.osdn.util.javafx.scene.control.pdf;
22
33 import javafx.application.Platform;
4+import javafx.beans.property.DoubleProperty;
45 import javafx.beans.property.IntegerProperty;
56 import javafx.beans.property.ObjectProperty;
7+import javafx.beans.property.ReadOnlyDoubleProperty;
68 import javafx.beans.property.ReadOnlyIntegerProperty;
9+import javafx.beans.property.ReadOnlyObjectProperty;
10+import javafx.beans.property.SimpleDoubleProperty;
711 import javafx.beans.property.SimpleIntegerProperty;
812 import javafx.beans.property.SimpleObjectProperty;
913 import javafx.collections.ObservableList;
@@ -10,6 +14,7 @@
1014 import javafx.concurrent.Task;
1115 import javafx.embed.swing.SwingFXUtils;
1216 import javafx.geometry.Point2D;
17+import javafx.geometry.Rectangle2D;
1318 import javafx.scene.Node;
1419 import javafx.scene.control.ProgressIndicator;
1520 import javafx.scene.image.ImageView;
@@ -97,6 +102,28 @@
97102 maxPageIndexProperty.set(value);
98103 }
99104
105+ private DoubleProperty renderScaleProperty
106+ = new SimpleDoubleProperty(this, "renderScale");
107+
108+ public ReadOnlyDoubleProperty renderScaleProperty() {
109+ return renderScaleProperty;
110+ }
111+
112+ public final double getRenderScale() {
113+ return renderScaleProperty.get();
114+ }
115+
116+ private ObjectProperty<Rectangle2D> renderBounds
117+ = new SimpleObjectProperty<Rectangle2D>(this, "renderBounds", Rectangle2D.EMPTY);
118+
119+ public ReadOnlyObjectProperty<Rectangle2D> renderBoundsProperty() {
120+ return renderBounds;
121+ }
122+
123+ public Rectangle2D getRenderBounds() {
124+ return renderBounds.get();
125+ }
126+
100127 private RenderingHints renderingHints;
101128
102129 private ProgressIndicator progressIndicator;
@@ -119,8 +146,6 @@
119146
120147 imageView = new ImageView();
121148 imageView.setPreserveRatio(true);
122- imageView.fitWidthProperty().bind(widthProperty());
123- imageView.fitHeightProperty().bind(heightProperty());
124149 getChildren().add(imageView);
125150
126151 progressIndicator = new ProgressIndicator();
@@ -178,11 +203,45 @@
178203 }
179204 isBusy = true;
180205 }
206+
207+ int pageIndex = getPageIndex();
208+
181209 PDDocument document = getDocument();
182210 if(document == null) {
183211 imageView.setImage(null);
212+ imageView.setX(0.0);
213+ imageView.setY(0.0);
214+ imageView.setFitWidth(0.0);
215+ imageView.setFitHeight(0.0);
216+ renderScaleProperty.set(0.0);
217+ renderBounds.set(Rectangle2D.EMPTY);
218+ } else {
219+ PDRectangle paper = document.getPage(pageIndex).getCropBox();
220+ int rotation = document.getPage(pageIndex).getRotation();
221+ double paperWidth = (rotation % 180 == 0) ? paper.getWidth() : paper.getHeight();
222+ double paperHeight = (rotation % 180 == 0) ? paper.getHeight() : paper.getWidth();
223+ double pdfViewWidth = getWidth();
224+ double pdfViewHeight = getHeight();
225+ double w;
226+ double h;
227+ if (paperWidth / paperHeight < pdfViewWidth / pdfViewHeight) {
228+ w = pdfViewHeight * paperWidth / paperHeight;
229+ h = pdfViewHeight;
230+ } else {
231+ w = pdfViewWidth;
232+ h = pdfViewWidth * paperHeight / paperWidth;
233+ }
234+ double x = (pdfViewWidth - w) / 2;
235+ double y = (pdfViewHeight - h) / 2;
236+ double scale = h / paperHeight;
237+ imageView.setX(x);
238+ imageView.setY(y);
239+ imageView.setFitWidth(w);
240+ imageView.setFitHeight(h);
241+ renderScaleProperty.set(scale);
242+ renderBounds.set(new Rectangle2D(x, y, w, h));
184243 }
185- int pageIndex = getPageIndex();
244+
186245 RenderingHints hints = getRenderingHints();
187246
188247 Screen screen = getScreen(this);
@@ -196,7 +255,9 @@
196255 WritableImage image = createImage(document, pageIndex, hints, width, height);
197256
198257 Platform.runLater(() -> {
199- imageView.setImage(image);
258+ if(image != null) {
259+ imageView.setImage(image);
260+ }
200261 });
201262
202263 synchronized (worker) {
@@ -221,16 +282,20 @@
221282 return null;
222283 }
223284 PDRectangle paper = document.getPage(pageIndex).getCropBox();
285+ int rotation = document.getPage(pageIndex).getRotation();
286+ double paperWidth = (rotation % 180 == 0) ? paper.getWidth() : paper.getHeight();
287+ double paperHeight = (rotation % 180 == 0) ? paper.getHeight() : paper.getWidth();
288+
224289 double w;
225290 double h;
226- if (paper.getWidth() / paper.getHeight() < width / height) {
227- w = height * paper.getWidth() / paper.getHeight();
291+ if (paperWidth / paperHeight < width / height) {
292+ w = height * paperWidth / paperHeight;
228293 h = height;
229294 } else {
230295 w = width;
231- h = width * paper.getHeight() / paper.getWidth();
296+ h = width * paperHeight / paperWidth;
232297 }
233- double scale = h / paper.getHeight();
298+ double scale = h / paperHeight;
234299
235300 if (bimg == null || bimg.getWidth() != (int) w || bimg.getHeight() != (int) h) {
236301 bimg = new BufferedImage((int) w, (int) h, BufferedImage.TYPE_INT_RGB);
Show on old repository browser