slovensko-digital / autogram

Nový, krajší a lepší nástroj na podpisovanie.
European Union Public License 1.2
104 stars 19 forks source link

Náhľad zobrazuje rovnaké obrázky napriek tomu, že sú rozdielne #451

Closed rasel-sk closed 2 weeks ago

rasel-sk commented 1 month ago

Mám PDF/A-1b s obrázkami dvoch podpisov. Obrázky podpisov sú náhľade Autogramu identické. Ak si otvorím PDF v Adobe Acrobat Reader, tak sú obrázky rozdielne. Obrázky majú rovnaké rozlíšenie a sú vo formáte data:image/jpeg;base64. Posielam screenshoty a PDF na testovanie.

obrázok

obrázok

AB-BB.pdf

celuchmarek commented 1 month ago

Vďaka za podnet. Otestoval som aj u seba a naozaj to robí toto. Je to strašne divné. Pridal som label bug.

Tu podľa mňa bude nejaký problém s pdfJS, ktoré používame na vizualizáciu PDF v HTML webview. @jsuchal nepoznáš také? Ty si kedysi práve na tejto časti robil.

Každopádne, chceme už dlhšie upgradnúť práve pdfJs na nejakú novšiu verziu, takže možno to súvisí s #73

jsuchal commented 1 month ago

Vyskusal som to v pdf.js tu https://mozilla.github.io/pdf.js/web/viewer.html a tam to vyzera takto image

@rasel-sk vies prezredit ako si taketo pdf vyrobil?

rasel-sk commented 1 month ago

@jsuchal Vytvoril som ho cez mPDF, ale myslím, že to nie je podstatné. Skúšal som rôzne verzie Autogramu (v1.99.0, v2.0.1, v2.1.69) a zakaždým rovnaký výsledok. Chrome, Edge, Firefox, Adobe Acrobat Reader ho zobrazujú správne... 4:1.

rasel-sk commented 1 month ago

The bug in PDF.js where different images were displayed as the same occurred between versions 2.7.570 and 2.13.216. This issue was specifically noted to have started in version 2.13.216​ (GitHub)​​ (GitHub)​.

In various discussions, users reported that certain PDFs displayed correctly in versions up to 2.7.570 but encountered rendering issues in versions starting from 2.13.216 onwards. These issues included images being misrepresented, such as different images being shown as the same​ (GitHub)​​ (GitHub)​.

For further details on this and related issues, you can review the discussions on GitHub issues #12537 and #14641​ (GitHub)​​ (GitHub)​.

jsuchal commented 1 month ago

Je to zlozitejsie, zjavne su to bugy ani nie tak v pdfjs ako v engine browseru. JavaFX WebView pouziva asi nejaku starsiu verziu. Ked lokalne skusam v javafx webview otvorit pdfjs (legacy mod) ale aj najnovsiu verziu 4.x, tak to robi to iste. image

rasel-sk commented 1 month ago

Strieľam od brucha a na slepo, ak je to problém sa cache (neviem otestovať):

package digital.slovensko.autogram.core.visualization;

import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Base64;

import digital.slovensko.autogram.core.SigningJob; import digital.slovensko.autogram.ui.Visualizer; import eu.europa.esig.dss.model.DSSDocument;

public class PDFVisualization extends Visualization { private final DSSDocument document;

public PDFVisualization(DSSDocument document, SigningJob job) {
    super(job);
    this.document = document;
}

private String getBase64EncodedDocument() {
    try {
        URL url = new URL(document.getName()); // Assuming document.getName() returns the URL of the document
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
        connection.setRequestProperty("Pragma", "no-cache");
        connection.setRequestProperty("Expires", "0");

        try (InputStream inputStream = connection.getInputStream();
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            return new String(Base64.getEncoder().encode(outputStream.toByteArray()), StandardCharsets.UTF_8);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

@Override
public void initialize(Visualizer visualizer) {
    visualizer.setPrefWidth(getVisualizationWidth());
    visualizer.showPDFVisualization(getBase64EncodedDocument());
}

}

jsuchal commented 1 month ago

@rasel-sk ja to skusam uplne mimo autogramu len cisty webview, cize toto najskor asi nie.

rasel-sk commented 1 month ago

@jsuchal WebView z default prehliadača namiesto JavaFX?

jsuchal commented 3 weeks ago

@rasel-sk to sa v javafx robi velmi zle a navyse by sme si trosku strelili do kolena. Takto mame aspon pod kontrolou aky webview tam je.

rasel-sk commented 3 weeks ago

@jsuchal Blbé je, že WebView JavaFX mi práve zle zobrazuje obrázky podpisov a nenašiel som spôsob ako to vyriešiť - náhľad nezobrazuje reálny obsah PDF. Menil som rozlíšenie, pridával 1px obrázky medzi faksimile a podobné zverstvá a bez výsledku. Z toho pramení zadanie tohto issue na GitHub. Mať pod kontrolou to čo nie je pod kontrolou je trocha paradox...

import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.BorderPane; import javafx.stage.Stage;

import java.awt.Desktop; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException;

public class OpenInDefaultBrowserExample extends Application {

@Override
public void start(Stage primaryStage) {
    Button openBrowserButton = new Button("Open in Default Browser");
    openBrowserButton.setOnAction(e -> {
        String url = "http://www.example.com";
        openWebpage(url);
    });

    BorderPane root = new BorderPane();
    root.setCenter(openBrowserButton);

    Scene scene = new Scene(root, 300, 200);
    primaryStage.setScene(scene);
    primaryStage.setTitle("Open in Default Browser Example");
    primaryStage.show();
}

public static void openWebpage(String url) {
    try {
        URI uri = new URI(url);
        if (Desktop.isDesktopSupported()) {
            Desktop.getDesktop().browse(uri);
        } else {
            String os = System.getProperty("os.name").toLowerCase();
            Runtime runtime = Runtime.getRuntime();
            if (os.contains("win")) {
                runtime.exec("cmd /c start " + url);
            } else if (os.contains("mac")) {
                runtime.exec("open " + url);
            } else if (os.contains("nix") || os.contains("nux")) {
                String[] browsers = { "xdg-open", "google-chrome", "firefox" };
                String browser = null;
                for (String b : browsers) {
                    if (runtime.exec(new String[] { "which", b }).getInputStream().read() != -1) {
                        browser = b;
                        break;
                    }
                }
                if (browser != null) {
                    runtime.exec(new String[] { browser, url });
                } else {
                    throw new UnsupportedOperationException("No supported browser found.");
                }
            }
        }
    } catch (URISyntaxException | IOException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    launch(args);
}

}

celuchmarek commented 3 weeks ago

Skúsil som práve použiť pdf-box na renderovanie pdf ako obrázok v #452 Je to trochu pomalšie, ale aspoň to teda zobrazuje správne veci. Vedeli by sme ešte nastavneie DPI hodiť do nastavení a na slabších systémoch by si to vedeli ľudia ešte zmenšiť. Ak však 99% podpisovaných PDF je do 5 strán, tak good enough. Čo myslíte?

jsuchal commented 3 weeks ago

Mať pod kontrolou to čo nie je pod kontrolou je trocha paradox...

Je, ale este stale moze byt horsie :D

Overime ci pdfbox je pouzitelny, @durasj to z nejakeho dovodu nepouzil, cize si na to treba davat pozor. @celuchmarek ma nejake prvotne riesenie, ale este by som to kukol.

jsuchal commented 3 weeks ago

FYI. Volal som si s Jakubom a vyzera, ze na pouzitie pdfbox nema blocker, resp. nevie o ziadnom probleme, ze ked kedysi davno pdf.js do octosign daval, ze by pdfbox zavrhol z nejakeho dobreho dovodu. Skor pdf.js bol projekt mozilla / firefox tak ho zobral ako doveryhodnejsi.

celuchmarek commented 2 weeks ago

Prerobili sme to do obrázkov z PDF Boxu. Celkovo to funguje a scrolluje lepšie než kedykoľvek predtým. Avšak pri väčších súboroch by sa hodil lazy loading - #456