Announcement

Collapse
No announcement yet.

PDFBOX Layer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PDFBOX Layer

    Hallo Zusammen,

    bei uns im Unternehmen werden durch eine Applikation Layer auf PDF´s gebracht um bestimmte Bereiche zu schwärzen.
    Meine Aufgabe ist es diese PDF´s aus dieser Applikation zu kopieren und in einer weitere Applikation zu kopieren. Dabei schränke ich mit PDFBOX die Zugriffsrechte auf dem PDF Dokument ein, damit diese Layer nicht verschoben oder entfernt werden können.
    Das funktioniert auch soweit.

    Nun haben wir aber das Problem, dass bei einigen Rechner kurzzeitig der Inhalt unter diesem Layer angezeigt werden. Das heißt kurzfristig ist der Bereich sichtbar, der geschwärzt wurde.

    Seht ihr eine Möglichkeit diese verschiedenen Layer zu verschmelzen damit sichergestellt ist, dass das PDF Dokument "als Ganzes" geladen wird?

    Vielen Dank im voraus und viele Grüße
    derOptimist

  • #2
    Wie wird es geladen?
    iText ->ImageLayer
    PDF ist seitenorientiert.
    Christian

    Comment


    • #3
      Scheint ja nicht wichtig zu sein
      Christian

      Comment


      • #4
        Hallo Christian,

        vielen Dank für die schnelle Antwort. Anbei mein Code, wie ich die PDF lade und auf einen Schreibschutz drauf lege:

        Code:
            AccessPermission ap = new AccessPermission();
            ap.setCanModifyAnnotations(false);
            ap.setCanExtractContent(false);
            ap.setCanExtractForAccessibility(false);
        
            PDDocument pdfDocument = PDDocument.load(inputFile);
            StandardProtectionPolicy spp = new StandardProtectionPolicy(UUID.randomUUID().toString(), "", ap);
            spp.setEncryptionKeyLength(256);
            pdfDocument.protect(spp);
        
            // Fix annotations
            for (PDPage page : pdfDocument.getPages()) {
                for (PDAnnotation annot : page.getAnnotations()) {
                    annot.setPrinted(true);
                    annot.setPage(page);
                    annot.setToggleNoView(false);
                }
            }
        
            pdfDocument.save(outputFile);
            pdfDocument.close();
        Zuletzt noch 2 Anhänge:
        https://my.fileee.com/shared/5d8632fb46e0fb000180b3cc --> Das PDF auf dem die Schwärzung vorgenommen wurde
        https://my.fileee.com/shared/5d86331d46e0fb000180b4d6 --> Das PDF, auf dem ich den Schreibschutz gesetzt habe

        Viele Grüße
        derOptimist

        Comment


        • #5
          Funktioniert hier einwandfrei,das flackert nichts oder ist langsam...den Schreibschutz kann man natürlich entfernen...
          Christian

          Comment


          • #6
            Ja das stimmt, ich kann das Problem an meinem Rechner auch nicht nachstellen. Aber bei ein paar Anwendern passiert das leider. Da es sichergestellt sein muss, dass dies aber nicht vorkommen darf muss ich da irgendetwas machen.
            Kennst du denn eine Möglichkeit die Ebenen zu verschmelzen?
            Ich habe auch schon darüber nachgedacht: PDF zu MultipageTiff konvertieren und dann wieder zu einem PDF machen. Da habe ich aber keine schöne, funktionierende Lösungen finden können.

            Comment


            • #7
              Nein. IMHO geht das auch nicht
              Ev. ein "Deckblatt" vorsetzen und wenn es eine weiße Seite ist. Die wird dann zuerst angezeigt
              Christian

              Comment


              • #8
                Ich habe es jetzt wie folgt gelöst. Damit ist sichergestellt, dass die Layer miteinander verschmolzen sind. Embedded Text, etc gehen natürlich verloren. Ist in meinen Fall aber nicht schlimm.

                Code:
                //Lade Dokument
                PDDocument document = PDDocument.load(inputFile);
                PDFRenderer renderer = new PDFRenderer(document);
                //Ermittle Anzahl der Seiten
                int numPages = document.getNumberOfPages();
                System.out.println( "numPages: " + numPages);
                //Lege grundsaetzlichen Dateinamen fuer die PNG-Dateien fest
                String exportFile = pathTmp + "\\" + UUID.randomUUID().toString();
                //Gehe PDF Seiten durch und erstelle PNG Datei
                for (int i = 0; i < numPages; i++)
                {
                    BufferedImage bim = renderer.renderImageWithDPI(i, 300, ImageType.RGB);
                    ImageIOUtil.writeImage(bim, exportFile + "-" + (i+1) + ".png", 300);
                }
                document.close();
                
                //Erzeuge neues PDF Dokument
                PDDocument documentNew = new PDDocument();
                //Gehe PDF Seiten durch und fuege PNG Dateien der PDF hinzu
                for (int i = 0; i < numPages; i++)
                {
                    //Lade PNG
                    InputStream in = new FileInputStream(exportFile + "-" + (i+1) + ".png");
                    BufferedImage bimg = ImageIO.read(in);
                    float width = bimg.getWidth();
                    float height = bimg.getHeight();
                    //Erstelle neue Seite mit Hoehe und Breite der PNG Dateien
                    PDPage pageNew = new PDPage(new PDRectangle(width, height));
                    documentNew.addPage(pageNew);
                    PDImageXObject img = PDImageXObject.createFromFile( exportFile + "-" + (i+1) + ".png", documentNew);
                    PDPageContentStream contentStream = new PDPageContentStream(documentNew, pageNew);
                    contentStream.drawImage(img, 0, 0);
                    contentStream.close();
                    in.close();
                    //Löschen der TMP-PNG Datei
                    Files.delete(Paths.get(exportFile + "-" + (i+1) + ".png"));
                }
                //Speichern der neuen PDF Datei
                documentNew.save(outputFile);
                documentNew.close();

                Comment

                Working...
                X