# PDF

Alles was mit PDF Programmen zu tun hat

# PDF entschlüsseln

# Python script zum entschlüsseln von PDF

Beschreibung:

Ein Python script das eine zum bearbeitende gesperrte PDF entsperrt in dem es die PDF nochmals Druckt und speichert.

Vorrausetzungen

```
pip install pyqt5 PyPDF2

```

Das Script auch zum Download : [removepermission.py](https://wiki.hacker-net.de/attachments/42)

```
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QFileDialog, QMessageBox
from PyPDF2 import PdfReader, PdfWriter

class PDFPasswordRemover(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # Layouts
        
        mainLayout = QVBoxLayout()
        sourceLayout = QHBoxLayout()
        targetLayout = QHBoxLayout()
        topLayout = QHBoxLayout()
        # Setzen Sie die Größe des Hauptfensters
        self.resize(500, 200)  # Ändern Sie diese Werte nach Bedarf
        self.setWindowTitle("Entfernen von Kennwort")

        # Über Button
        aboutButton = QPushButton("Über", self)
        aboutButton.clicked.connect(self.showAboutInfo)
        topLayout.addWidget(aboutButton)
        topLayout.addStretch()

        # Source file widgets
        self.sourceEntry = QLineEdit(self)
        sourceBrowseButton = QPushButton("Quelle Durchsuchen", self)
        sourceBrowseButton.clicked.connect(self.browseSourceFile)
        sourceLayout.addWidget(self.sourceEntry)
        sourceLayout.addWidget(sourceBrowseButton)

        # Target file widgets
        self.targetEntry = QLineEdit(self)
        targetSaveButton = QPushButton("Ziel Durchsuchen", self)
        targetSaveButton.clicked.connect(self.saveTargetFile)
        targetLayout.addWidget(self.targetEntry)
        targetLayout.addWidget(targetSaveButton)

        # Decrypt button
        decryptButton = QPushButton("Entschlüsseln", self)
        decryptButton.clicked.connect(self.decryptPDF)

        # Result label
        self.resultLabel = QLabel("", self)

        # Adding widgets to main layout
        mainLayout.addLayout(topLayout)
        mainLayout.addLayout(sourceLayout)
        mainLayout.addLayout(targetLayout)
        mainLayout.addWidget(decryptButton)
        mainLayout.addWidget(self.resultLabel)

        self.setLayout(mainLayout)
        self.setWindowTitle("Entfernen von Kennwort")

    def showAboutInfo(self):
        QMessageBox.about(self, "Über", "Hacker-Net Telekommunikation\nAm Wunderburgpark 5b\n26135 Oldenburg\n\nhttps://www.hacker-net.de")


    def browseSourceFile(self):
        file_path, _ = QFileDialog.getOpenFileName(self, "Quell-PDF wählen", "", "PDF Files (*.pdf)")
        if file_path:
            self.sourceEntry.setText(file_path)

    def saveTargetFile(self):
        file_path, _ = QFileDialog.getSaveFileName(self, "Ziel-PDF speichern", "", "PDF Files (*.pdf)")
        if file_path:
            self.targetEntry.setText(file_path)

    def decryptPDF(self):
        source = self.sourceEntry.text()
        target = self.targetEntry.text()
        if source and target:
            message = self.removePassword(source, target)
            self.resultLabel.setText(message)
        else:
            self.resultLabel.setText("Bitte wählen Sie die Quell- und Zielpfade aus.")

    def removePassword(self, source_path, target_path):
        try:
            reader = PdfReader(source_path)
            writer = PdfWriter()
            for page in reader.pages:
                writer.add_page(page)
            with open(target_path, "wb") as output_pdf:
                writer.write(output_pdf)
            return "Erfolg: PDF wurde erfolgreich gespeichert."
        except Exception as e:
            return f"Fehler: {e}"

def main():
    app = QApplication([])
    ex = PDFPasswordRemover()
    ex.show()
    app.exec_()

if __name__ == '__main__':
    main()
```

Möchte man das Script in eine einzelne Ausführbare Datei packen.  
Ist pyinstaller nützlich.  
Siehe hier : [Python als Einzel Executable](https://wiki.hacker-net.de/books/python/chapter/python-als-einzel-executable "Python als Einzel Executable")

# PDF komprimieren

# Quelltext PDF compress

### Beschreibung:

Ein python script mit Grafischer oberfläche, das eine riesen PDF komprimiert.

### Das Script:

```
import sys
import PyPDF2
import subprocess
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QFileDialog, QMessageBox, QLabel
from PyQt5.QtCore import Qt  # Hinzugefügt


# Externe Funktion für die PDF-Komprimierung
def compress_pdf(source_path, output_path):
    try:
        subprocess.run([
            "gs", "-sDEVICE=pdfwrite", "-dCompatibilityLevel=1.4",
            "-dPDFSETTINGS=/ebook",  # Ändern Sie dies für unterschiedliche Komprimierungslevel
            "-dNOPAUSE", "-dBATCH", "-dQUIET",
            f"-sOutputFile={output_path}", source_path
        ], check=True)
    except subprocess.CalledProcessError as e:
        raise RuntimeError(f"Ein Fehler ist aufgetreten: {e}")
    except Exception as e:
        raise RuntimeError(f"Ein unerwarteter Fehler ist aufgetreten: {e}")


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.title = 'PDF Komprimieren'
        self.source_pdf_path = ''
        self.target_pdf_path = ''
        self.initUI()
    
    def initUI(self):
        self.setWindowTitle(self.title)
        layout = QVBoxLayout()

        # Titel Label
        self.label_title = QLabel(self.title, self)
        self.label_title.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.label_title)

        # Button für Quelldatei
        self.btn_browse_source = QPushButton('Quelle Durchsuchen', self)
        self.btn_browse_source.clicked.connect(self.openSourceFileDialog)
        layout.addWidget(self.btn_browse_source)

        # Button für Zieldatei
        self.btn_browse_target = QPushButton('Ziel Durchsuchen', self)
        self.btn_browse_target.clicked.connect(self.openTargetFileDialog)
        layout.addWidget(self.btn_browse_target)

        # Verkleinern-Button
        self.btn_compress = QPushButton('Verkleinern', self)
        self.btn_compress.clicked.connect(self.compressPDF)
        layout.addWidget(self.btn_compress)

        # Über-Button
        self.btn_about = QPushButton('Über', self)
        self.btn_about.clicked.connect(self.showAboutInfo)
        layout.addWidget(self.btn_about)

        self.setLayout(layout)
        self.adjustSize()  # Passt die Größe an die Widgets an

        # Setzt die feste Breite des Fensters
        self.setFixedWidth(500)
        self.show()

    def openSourceFileDialog(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self, "Quelldatei auswählen", "", "PDF-Dateien (*.pdf)", options=options)
        if fileName:
            self.source_pdf_path = fileName

    def openTargetFileDialog(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getSaveFileName(self, "Zieldatei speichern", "", "PDF-Dateien (*.pdf)", options=options)
        if fileName:
            self.target_pdf_path = fileName

    def showAboutInfo(self):
        QMessageBox.information(self, "Über", "Hacker-Net Telekommunikation\nAm Wunderburgpark 5b\n26135 Oldenburg")

    

    def compressPDF(self):
        if self.source_pdf_path and self.target_pdf_path:
            try:
                # Rufen Sie die externe Komprimierungsfunktion auf
                compress_pdf(self.source_pdf_path, self.target_pdf_path)
                QMessageBox.information(self, "Erfolg", "PDF erfolgreich komprimiert und gespeichert!")
            except Exception as e:
                QMessageBox.warning(self, "Fehler", str(e))
        else:
            QMessageBox.warning(self, "Fehler", "Bitte wählen Sie sowohl eine Quell- als auch eine Zieldatei.")



if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

```

Das Script zum direct download [hier](https://wiki.hacker-net.de/attachments/43)  
Das Programm icon, wenn an eine Executable draus erstellen möchte zum direct download [hier](https://wiki.hacker-net.de/attachments/44)

# Eine Ausführbare Datei daraus erstellen

# PDF Selfhost Online Toools Stirling PDF Tools

# Installation via Docker

Beschreibung:  
  
[https://github.com/Stirling-Tools/Stirling-PDF?tab=readme-ov-file](https://github.com/Stirling-Tools/Stirling-PDF?tab=readme-ov-file)