Barcode mit nicht gewollter angehängter Ziffer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Hallo an alle,
ich habe da mal eine allgemeine Frage zu Barcodes.
Ich erstelle mit

Code: Alles auswählen

    def create_barcode_on_pdf(self, barcode_value, original_path):
        pdf = pdfquery.PDFQuery(original_path)
        total_pages = pdf.doc.catalog['Pages'].resolve()['Count']
        output = PdfFileWriter()
        for i in range(0, total_pages):
            pdf.load(i)
            # NOT DUPLICATE PAGE
            packet = BytesIO()
            c = canvas.Canvas(packet, pagesize=letter)

            barcode = code39.Extended39(str(1234567890), barWidth=0.5 * mm, barHeight=20 * mm)
            barcode.drawOn(c, 100 * mm, 100 * mm)
            c.save()

            packet.seek(0)
            new_pdf = PdfFileReader(packet)
            existing_pdf = PdfFileReader(open(original_path, "rb"))
            page = existing_pdf.getPage(i)
            page.mergePage(new_pdf.getPage(0))
            output.addPage(page)

        if not os.path.exists(self.fld_path_barcodes):
            os.makedirs(self.fld_path_barcodes)

        outputStream = open(os.path.join(self.fld_path_barcodes, f'{barcode_value}.pdf'), "wb")
        output.write(outputStream)
        outputStream.close()



auf einem schon bestehenden PDF zusätzlich einen Barcode. Danach drucke ich das PDF aus und scanne den Barcode.
Der gescannte Barcode besteht aber immer aus der angegebenen Zahl und einer an letzter Stelle angehängten Ziffer.
Wenn ich den Barcode str(1234567890) erstellen will, wird ein Barcode 12345678902 ausgelesen.
Durch die zusätzlich angehängte 2 am Ende, kann ich natürlich den Barcode (also das PDF) nicht mehr wiederfinden.
Wenn ich den Barcode 0123456789 angebe, möchte ich auch 0123456789 auslesen.
Wie bekomme ich es hin, einen Barcode zu erzeugen, der ausschließlich aus der Zahl besteht, die ich angebe?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Durch 10 teilen, mit //.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du sagst ja auch, dass noch zusätzlich ein Prüfzeichen angehängt werden soll, wenn Du das nicht willst, dann stell das halt so ein:

Code: Alles auswählen

barcode = code39.Extended39(str(1234567890), barWidth=0.5 * mm, barHeight=20 * mm, checksum=False)
Warum benutzt Du PDFQuery, bzw. benutzt es gar nicht? Das kann also weg.
Warum liest Du jedesmal die gesamte PDF-Datei neu, nur um eine Seite zu lesen?
Und warum öffnest Du ständig Dateien, ohne sie wieder zu schließen?
Und warum erzeugst Du für jede Seite einen Barcode, der sich aber nie ändert?
os.path benutzt man nicht mehr, statt dessen pathlib.

Code: Alles auswählen

    def create_barcode_on_pdf(self, barcode_value, original_path):
        packet = BytesIO()
        c = canvas.Canvas(packet, pagesize=letter)
        barcode = code39.Extended39(str(1234567890),
            barWidth=0.5 * mm, barHeight=20 * mm, checksum=False)
        barcode.drawOn(c, 100 * mm, 100 * mm)
        c.save()
        packet.seek(0)
        barcode_page = PdfFileReader(packet).pages[0]

        with open(original_path, "rb") as input_pdf:
            existing_pdf = PdfFileReader(input_pdf)
            output = PdfFileWriter()
            for page in existing_pdf.pages:
                page.mergePage(barcode_page)
                output.addPage(page)

        path = pathlib.Path(self.fld_path_barcodes)
        path.mkdir(parents=True, exist_ok=True)
        with (path / f'{barcode_value}.pdf').open('wb') as output_pdf:
            output.write(output_pdf)
Zuletzt geändert von Sirius3 am Samstag 3. Juni 2023, 14:48, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

`barcode = code39.Extended39(str(1234567890), barWidth=0.5 * mm, barHeight=20 * mm)` erstellt den Barcode mit zusätzlicher Prüfsumme. Ich kenne das Package jetzt nicht, aber kurzes googlen sagt, dass man eventuell den zusätzlichen Parameter `add_checksum=False` verwenden kann, wenn man die Prüfsumme nicht möchte.

Edit: Oder vielleicht ist es auch `checksum=False` wie Sirius3 schrieb. Schau halt in die Doku.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei die Prüfsumme ja auch einen Sinn hat. Warum will man darauf verzichten?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Vielen Dank an euch. Ich kenne mich mit Barcodes noch nicht aus. Habe das Programm einfach erstmal versucht zum laufen zu bringen.
@/me: Naja, ich würde mich nicht so als Leseratte bezeichnen. Versuche immer erst alles möglichst ohne viel lesen zu müssen. :)
@Sirius3: Ja, da hast du natürlich sowas von recht. Mein Hauptaugenmerk ist aber grad am Anfang das Ziel. Im zweiten Schritt kümmere ich mich dann um die Performance. :)
Vielen Dank für eure Kritik :)
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

@sirius3 nochmal:
Warum benutzt Du PDFQuery, bzw. benutzt es gar nicht? Das kann also weg.
Warum liest Du jedesmal die gesamte PDF-Datei neu, nur um eine Seite zu lesen?
Und warum öffnest Du ständig Dateien, ohne sie wieder zu schließen?
Und warum erzeugst Du für jede Seite einen Barcode, der sich aber nie ändert?
os.path benutzt man nicht mehr, statt dessen pathlib.
Ich habe das alles so unvorteilhaft gemacht, weil ich einen Barcode zusätzlich zu einem schon bestehenden PDF nur an einer Stelle zufügen möchte.
Habe deinen Code grad getestet. Dort wird das PDF mit dem Barcode überschrieben, so dass das ursprüngliche PDF futsch ist und nur noch der Barcode auf der Seite zu finden ist. :)
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Ich versuche es jetzt auch selbst besser hinzubekommen.
Thanx an euch nä :):)
Antworten