From 3806b3d63b15b221490f30a13cc38f071c424d90 Mon Sep 17 00:00:00 2001 From: j-dimension Date: Tue, 28 May 2024 17:27:04 +0200 Subject: [PATCH] rotate functionality. issue #2409 --- .../viewer/PdfImageScrollingPanel.java | 58 +++++++++++++++---- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/j-lawyer-client/src/com/jdimension/jlawyer/client/editors/documents/viewer/PdfImageScrollingPanel.java b/j-lawyer-client/src/com/jdimension/jlawyer/client/editors/documents/viewer/PdfImageScrollingPanel.java index 42d5e8c2e..72e6c155c 100644 --- a/j-lawyer-client/src/com/jdimension/jlawyer/client/editors/documents/viewer/PdfImageScrollingPanel.java +++ b/j-lawyer-client/src/com/jdimension/jlawyer/client/editors/documents/viewer/PdfImageScrollingPanel.java @@ -674,6 +674,7 @@ import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; @@ -682,11 +683,13 @@ import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import org.apache.log4j.Logger; import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; @@ -697,7 +700,7 @@ public class PdfImageScrollingPanel extends javax.swing.JPanel implements PreviewPanel { private static final Logger log = Logger.getLogger(PdfImageScrollingPanel.class.getName()); - private static final int MAX_RENDER_PAGES = 20; + private static final int MAX_RENDER_PAGES = 10; private transient Object zoomSemaphore = ""; HashMap orgImage = new HashMap<>(); @@ -724,6 +727,7 @@ public class PdfImageScrollingPanel extends javax.swing.JPanel implements Previe public PdfImageScrollingPanel(String fileName, byte[] content) { initComponents(); this.fileName = fileName; + this.content=content; this.lblTotalPages.setIcon(null); ThreadUtils.updateLabel(this.lblContent, ""); @@ -756,7 +760,8 @@ public PdfImageScrollingPanel(String fileName, byte[] content) { // begin rendering additional pages once the user scrolls to the 2nd last page if (((labelIndex + 1) == renderedPages || (labelIndex + 1) == renderedPages-1) && renderedPages < totalPages && !rendering) { - this.renderContent(content, labelIndex, labelIndex + 1, labelIndex + MAX_RENDER_PAGES, zoomFactor); + System.out.println("rendering " + renderedPages + " - " + (renderedPages + MAX_RENDER_PAGES)); + this.renderContent(labelIndex, renderedPages, renderedPages + MAX_RENDER_PAGES, zoomFactor); } lblCurrentPage.setText("" + (labelIndex + 1) + "/" + renderedPages); @@ -1054,11 +1059,11 @@ private void cmdRotateLeftActionPerformed(java.awt.event.ActionEvent evt) {//GEN }//GEN-LAST:event_cmdRotateLeftActionPerformed private void rotateAllPages(int degrees) { - if(this.renderedPages < this.totalPages) { - // load entire document - this.renderContent(content, currentPage+1, renderedPages - 1, totalPages - 1, zoomFactor); - - } +// if(this.renderedPages < this.totalPages) { +// // load entire document +// this.renderContent(content, currentPage+1, renderedPages - 1, totalPages - 1, zoomFactor); +// +// } int[] pageIndexes = new int[totalPages]; for (int i = 0; i < this.totalPages; i++) { pageIndexes[i] = i; @@ -1089,14 +1094,14 @@ public void showStatus(String text) { ThreadUtils.updateLabel(this.lblContent, text); } - private synchronized void renderContent(byte[] content, int currentIndex, int fromPageIndex, int toPageIndex, int zoomFactor) { + private synchronized void renderContent(int currentIndex, int fromPageIndex, int toPageIndex, int zoomFactor) { if(rendering) { log.info("PDFs are currently being rendered - skipping concurrent rendering"); } + log.info("do rendering for " + fromPageIndex + " - " + toPageIndex); this.sliderZoom.setEnabled(false); this.cmdFitToScreen.setEnabled(false); - this.content = content; try { if (content != null) { if (content.length > 5000000) { @@ -1148,6 +1153,8 @@ private synchronized void renderContent(byte[] content, int currentIndex, int fr height1 = (int) ((float) height1 * ((float) ((float) zoomFactor / 100f))); width1 = (int) ((float) width1 * ((float) ((float) zoomFactor / 100f))); + // todo: check for landscape mode and display those pages with lower height + BufferedImage scaledImage = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = scaledImage.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); @@ -1244,9 +1251,11 @@ private BufferedImage loadBufferedImage(File f) { @Override public void showContent(String documentId, byte[] content) { this.documentId = documentId; + this.content=content; this.currentPage = 0; this.pnlPages.removeAll(); - this.renderContent(content, 0, 0, 19, this.zoomFactor); + System.out.println("rendering2 " + 0 + " - " + 9); + this.renderContent(0, 0, 9, this.zoomFactor); } @@ -1261,6 +1270,27 @@ public String getDocumentId() { } public void rotatePage(int[] pageIndexes, int degrees) { + + try { + PDDocument inputPDF = PDDocument.load(new ByteArrayInputStream(content)); + for (int pageNumber : pageIndexes) { + + PDPage page = inputPDF.getPage(pageNumber); + + page.setRotation(degrees); + } + + ByteArrayOutputStream bout=new ByteArrayOutputStream(); + inputPDF.save(bout); + inputPDF.close(); + this.content=bout.toByteArray(); + + } catch (Exception ex) { + log.error("Could not rotate PDF pages", ex); + JOptionPane.showMessageDialog(this, "Fehler beim Aktualisieren des PDFs: " + ex.getMessage(), com.jdimension.jlawyer.client.utils.DesktopUtils.POPUP_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); + return; + } + for (int pageIndex : pageIndexes) { if (this.orgImage.containsKey(pageIndex)) { BufferedImage bi = loadBufferedImage(this.orgImage.get(pageIndex)); @@ -1272,7 +1302,13 @@ public void rotatePage(int[] pageIndexes, int degrees) { int width1 = (int) ((float) rotated.getWidth() * scaleFactor); height1 = (int) ((float) height1 * ((float) ((float) zoomFactor / 100f))); width1 = (int) ((float) width1 * ((float) ((float) zoomFactor / 100f))); - Image bi2 = rotated.getScaledInstance(width1, height1, Image.SCALE_SMOOTH); + //Image bi2 = rotated.getScaledInstance(width1, height1, Image.SCALE_SMOOTH); + + BufferedImage bi2 = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = bi2.createGraphics(); + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g2d.drawImage(rotated, 0, 0, width1, height1, null); + g2d.dispose(); Component[] components = pnlPages.getComponents(); if (components[pageIndex] instanceof PdfPageImage) {