Forum: PC-Programmierung C# PDF in Excel umwandeln


von Robin F. (gehacktes)


Lesenswert?

Hallo zusammen,

ich versuche aktuell ein Projekt umzusetzen aber scheitere an einem 
Punkt.
Und zwar geht es darum das ich bestimmte Bereiche aus einer PDF Datei in 
ein Excel oder anderes Dokument übertragen will.

Zu meiner Idee zur Umsetzung:
1. PDF in Form laden
2. per Button die Selektierung eines Bereiches in der PDF aktivieren. 
Wie beim Snipping Tool Bereich markieren.
3. aus dem Bereich ein .png machen und per OCR auslesen (damit man jedes 
PDF ob gescannt oder elektronisch erstellt umwandeln kann).
4. In Excel oder ähnliches übertragen.

Zu meiner Problematik:
Ich finde keine Möglichkeit einen Screenshot von einem Bereich, in dem 
PDF Reader, in der Form zu machen.
Was ich bisher gefunden habe. Ein Screenshot vom gesamten Monitor zu 
machen und aus diesem Bild einen Bereich auszuschneiden und in einer 
zweiten PictureBox anzeigen zu lassen. Mit einer PDF funktioniert das 
allerdings nicht. Vorher ein Bild aus der PDF zu machen ist auch nicht 
möglich da die PDF auch mehrere Seiten haben kann.

Hier ein Auszug aus dem Programm womit ich den Screenshot und das 
Ausschneiden mache:
1
private void button1_Click(object sender, EventArgs e)
2
{
3
// Screenshot
4
  this.Hide();
5
  System.Threading.Thread.Sleep(500);
6
  SendKeys.Send("{PRTSC"});
7
  Image myImage = Clipboard.GetImage();
8
  pictureBox1.Image = myImage;
9
  this.Show();
10
//   MouseEvent Rahmen ziehen
11
  pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
12
    pictureBox1.MouseMove += new MouseEventHandler(pictureBox1_MouseMove);
13
    pictureBox1.MouseEnter += new EventHandler(pictureBox1_MouseEnter);
14
    Controls.Add(pictureBox1);
15
}
16
17
int crpX,crpY,rectW,rectH;
18
19
public Pen crpPen = new Pen(Color.White);
20
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
21
    {
22
        base.OnMouseDown(e);
23
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
24
        {
25
      Cursor = Cursors.Cross;
26
      crpPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
27
      crpX = e.X;
28
      crpY = e.Y;
29
30
        }
31
    }
32
  
33
private void button2_Click(object sender, EventArgs e)
34
{
35
  Cursor = Cursors.Default;
36
  Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
37
    pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
38
39
    Bitmap crpImg = new Bitmap(rectW, rectH);
40
41
    for( int i = 0; i < rectW; i++)
42
    {
43
        for(int y = 0; y < rectH; y++)
44
        {
45
            Color pxlclr = bmp.GetPixel(crpX + i, crpY + y);
46
            crpImg.SetPixel(i, y, pxlclr);
47
        }
48
    }
49
50
    pictureBox2.Image = (Image)crpImg;
51
    pictureBox2.SizeMode = PictureBoxSizeMode.CenterImage;
52
  }  
53
}
54
55
private void pictureBox1_MouseEnter(object sender, EventArgs e)
56
    {
57
        base.OnMouseEnter(e);
58
        Cursor = Cursors.Cross;
59
    }
60
61
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
62
    {
63
        base.OnMouseMove(e);
64
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
65
        {
66
            pictureBox1.Refresh();
67
            //set width and height for crop rectangle.
68
            rectW = e.X - crpX;
69
            rectH = e.Y - crpY;
70
            Graphics g = pictureBox1.CreateGraphics();
71
            g.DrawRectangle(crpPen, crpX, crpY, rectW, rectH);
72
            g.Dispose();
73
        }
74
    }
75
  
76
protected override void OnMouseEnter(EventArgs e)
77
{
78
    base.OnMouseEnter(e);
79
    Cursor = Cursors.Default;
80
}

Kann mir einer sagen wie man diesen "Area Screenshot" machen kann oder 
habt ihr andere Ideen das umzusetzen?

Danke und Gruß
Robin

von Martin S. (sirnails)


Lesenswert?

Schau Dir doch mal die PDF Creator Library an, die mit dem Creator mit 
kommt (oder ist das eine ActiveX?). Die kann das Extrahieren. Dann 
machst Du eine Instanz der Excel ActiveX auf, und fügst das ganze ein.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

PDF ist eine komplexe objektorientierte Struktur, da muss man entweder 
sehr tief eindringen oder eine fertige Lib verwenden.

Ich empfehle das Projekt "PDFBox" von Apache, speziell die Command Line 
Tools. Da gibt es auch den Befehl "text extraction" ... der legt den 
Rohtext (parametrierbar) in einem File ab, dort kannst du ihn dann 
einsammelnb und ein Excel daraus machen ...

PDFBox ist in Java geschrieben, man kann die Sourcen in ein eigenes 
Projekt einbinden. Die CLI-Tools sind auch einzeln lauffähig (sofern ein 
JRE installiert ist). Läuft auf Win, Mac und Linux.

https://pdfbox.apache.org/2.0/commandline.html

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

ghostscript kann ebenfalls Text oder Graphik ausgeben.
Es kann sein, dass der Text nicht auswertbar ist, dann geht nur OCR.
Siehe Beitrag "Daten aus problematischem PDF extrahieren? (Wahl-O-Mat Antworten)"

von Sheeva P. (sheevaplug)


Lesenswert?

Robin F. schrieb:
>   SendKeys.Send("{PRTSC"});

?

von oszi40 (Gast)


Lesenswert?

Robin F. schrieb:
> aus dem Bereich ein .png machen und per OCR auslesen

Ganz so einfach wirds wohl nicht mit OCR, da eine Erkennungsrate von 99% 
heißt, daß das 100. Zeichen falsch sein könnte! Nimm mal z.B. das 
Programm pdf to txt und schau nach wie hoch die Fehlerrate bei Deinem 
Blatt ist. Es kommt ganz darauf an was man erfassen muß.

Eine Stückliste mit immer wiederkehrenden Begriffen hat eine andere 
Trefferrate als Grimms Märchen. Hintergrund sind automatische 
Korrekturen und ob der ausgewählte Bereich schon als TEXT oder als Bild 
im pdf ist.

von schmitti (Gast)


Lesenswert?

Sheeva P. schrieb:
> Robin F. schrieb:
>>   SendKeys.Send("{PRTSC"});
>
> ?

https://www.google.com/search?client=firefox-b-d&q=SendKeys.Send%28%22%7BPRTSC%22%7D%29

"PRinTScreen", als wenn mna "Druck" auf der Tastatur drückt.

von Robin F. (gehacktes)


Lesenswert?

Hallo,

danke für die vielen Nachrichten.
Das OCR nicht fehlerfrei ist bzw. nicht alles erkennt,habe ich bereits 
festgestellt.
Um meine Vorstellung von dem Programm vielleicht nochmal deutlicher zu 
zeugen.
Hier ein Video: https://www.youtube.com/watch?v=x61E67Y7GB4
Ich will genau wie in diesem Video Tabellen (Stücklisten) aus einer PDF 
Datei extrahieren. Ich fand die Lösung aus dem Video mit dem Snipping 
Tool + OCR ganz interessant. Das heißt aber ich muss eine manuelle 
Prüfung der extrahierten Datei vornehmen, was für den Anfang noch nicht 
so schlimm ist.

Da ich mit dem Snipping Tool noch nicht weiter gekommen bin, habe ich 
mich erstmal mit OCR beschäftigt aber festgestellt das die librarys 
nicht unbedingt kostenfrei sind sondern Testversionen für 30 Tage.

Aktuell überlege ich ob es nicht vlt. auch Sinn machen könnte das ganze 
in Python zu realisieren. Dazu finde ich mehr Informationen was das 
ausschneiden und dich OCR Funktion betrifft.

Gruß
Robin

von Dirk (Gast)


Lesenswert?

OCR schau Dir Tesseract >=4.0 an z.B. mit gImageReader, dafür findest Du 
auch C# Wrapper (kostenlos, LSTM), aber besser wäre etwas mit Online AI, 
aber die Kosten alle Geld, falls es immer der gleiche Font ist, dann 
kannst du in Tesseract nochmal versuchen zu optimieren.

Zu dem Video:
Er hat mit Absicht die Überschriftspalten nicht genommen, weil es zu 
Fehlern kommen sollte.

gImageReader ist in Qt Widgets und C++ programmiert, falls Du von C# weg 
willst, dann hast Du ein gutes Referenzprojekt, ansonsten wie gesagt 
gibt es auch Tesseract Wrapper für C#

https://github.com/manisandro/gImageReader/releases

von MaWin (Gast)


Lesenswert?

Robin F. schrieb:
> Zu meiner Problematik:
> Ich finde keine Möglichkeit einen Screenshot von einem Bereich, in dem
> PDF Reader, in der Form zu machen.

Na ja, das (Windows von fremden Programmem photographiere) können sehr 
viele Programme (obwohl ich das für ein Sicherheitsrisiko halte), 
Screenshot-Programme gibt es auch in Source als Samples, sie arbeiten 
i.A. nicht mit PrtSc.

Der Screenshot ist oftmals auch der einzig sinnvolle Weg, denn PDF 
können sehr unterschiedlich aufgebaut sein, abhängig von der Quelle die 
sie erzeugt hat. Als Bilder, als einzelne Buchstaben kreuz und quer, als 
Text in Fliessrichtung, und wie Unicode umgesetzt wird ista uch 
unterschiedlich, oftmals ergibt eine Kopie (markieren, kopieren im 
Acrobat eader) eines Textabschnitts beim Einfügen (in einem Textenditor) 
nur Unsinn, weil die Zeichen aus einem zusammengewürfelten Font stammen 
(also 65 ist nicht mehr A).

Wenn man aus verschiedenen PDF eine PDF to TXT Wandlung mit diversen 
(Online-)Tools macht sieht man sehr schön die unterschiedlichsten 
Ergebnisse und damit Ansätze die das Programm macht.

Wenn deine PDF ber immer aus einer Quelle stammen, und es damit geht, 
würde ich den direkten Weg mit PDF to TXT Tools/Library gehen.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Bei meinem letzten Beitrag hatte ich übersehen, dass es sich um 
gescannte Daten handelt - also schlicht Pixeldaten in einem 
PDF-Container. Da nützt "PDF to Text" erstmal wenig, das exportiert nur 
die im PDF enthaltenen "echten" Textobjekte.

Hier steht also tatsächlich zuerst das Umwandeln der  PDF-Seiten in ein 
anderes, einfach zu handhabendes Dateiformat (am Besten PNG oder TIFF) 
oder ein internes Grafikobjekt an.
Auch hier empfehle ich die (kostenfreie) Apache-PDFBox mit dem CLI-Tool 
"PDF to Image" (Seite, Farbmodell und Auflösung einstellbar). Das 
CLI-Tool läuft ohne jede Installation oder aufwändigem Script-Gefruzzel 
out-of-the-box. Ein CLI-Programm mit Parametern aus C++ heraus zu 
starten, sollte doch kein Problem sein, oder?
Screenshots halte ich in dem Zusammenhang für völlig unnötigen Pfusch 
... sorry, wenn man die Datei so einfach direkt umwandeln kann.

Erst der zweite Schritt ist dann das "Zerschneiden" der geladenen 
Pixelbilder bzw. der internen Grafikobjekte in einzelne interessierende 
Bereiche, um darauf (als dritten Schritt) den OCR-Prozess anzuwenden.

: Bearbeitet durch User
von oszi40 (Gast)


Lesenswert?

Frank E. schrieb:
> Bereiche, um darauf den OCR-Prozess anzuwenden.

Lange Geschichte und am Ende reicht wohl die Auflösung nicht, um eine 
AUSREICHEND gute OCR-Erkennungsrate zu erreichen....
ERST mal prüfen OB seine Bilder überhaupt geeignet sind!

von Robin F. (gehacktes)


Lesenswert?

Hallo,

die Auflösung ist gut. Es sind digital erstelle Montageanweisungen aus 
einem CAD Programm mit einer Stückliste (diese will ich auslesen und in 
Excel übertragen). An die CAD Daten komme ich nicht ran und ich kann 
auch keinen Export anfragen. Daher versuche ich die oben genannte 
Lösung.
Für die Zukunft soll das mal ein universell einsetzbares Tool werden, da 
wir oft ähnliche Dokumente oder Scanns bekommen und wir die umwandeln 
können wollen.
Ich kann euch leider die PDF nicht zeigen, da diese geheime Dokumente 
sind.
Sie sehen aber im entfernten Sinne aus wie diese hier: 
http://technische-dokumentation-hoffmann.com/de/pdm-erstellung
nur viel komplexer.

Ich guck mir mal das CLI-Tool an. Ich würde aber gern nur einen 
bestimmten Bereich der PDF auslesen lassen, da ich auf der linken Seite 
des Dokuments immer ein Bild eines Montageschritts habe.

Danke erstmal.

von Dirk K. (merciless)


Lesenswert?

Robin F. schrieb:
> Hallo,
>
> danke für die vielen Nachrichten.
> Das OCR nicht fehlerfrei ist bzw. nicht alles erkennt,habe ich bereits
> festgestellt.
> Um meine Vorstellung von dem Programm vielleicht nochmal deutlicher zu
> zeugen.
> Hier ein Video: https://www.youtube.com/watch?v=x61E67Y7GB4
> Ich will genau wie in diesem Video Tabellen (Stücklisten) aus einer PDF
> Datei extrahieren. Ich fand die Lösung aus dem Video mit dem Snipping
> Tool + OCR ganz interessant. Das heißt aber ich muss eine manuelle
> Prüfung der extrahierten Datei vornehmen, was für den Anfang noch nicht
> so schlimm ist.

Muss es denn überhaupt OCR sein? Das benötigt man doch nur,
wenn die Tabellen als Grafik ins PDF eingebunden sind. Hast
du dich mal mit dem Format von PDF-Dateien beschäftigt?

merciless

von Robin F. (gehacktes)


Lesenswert?

Für die aktuellen PDF Dateien ist es nicht zwangsweise notwendig OCR zu 
nutzen.
Für mich war das allerdings auf dem ersten Blick die beste Lösung um zum 
einen universelle Scanns und digital erstellte Dokumente umwandeln zu 
können und zum anderen hat dieser Weg für mich am meisten Sinn gemacht, 
da ich ja mit der Screenshot-Methode das ganze realisieren will/wollte.

Ist aber vielleicht auch kein schlechter Ansatzpunkt sich lieber mal mit 
dem PDF-Format zu beschäftigen.

von oszi40 (Gast)


Lesenswert?

Robin F. schrieb:
> mal mit dem PDF-Format zu beschäftigen.

So ganz einfach ist es nur, wenn man gleich die Zeichen alle lesen kann 
mit pdf to txt. Es gibt leider auch Zeichensätze, die werden erst 
zusammengebastelt und sind somit nicht gleich erkennbar mit dem 
Hexeditor. Schau Dir einfach Deine speziell gewünschten pdf als Beispiel 
mit dem Hexeditor an! Die Variante FineReader bleibt dann noch. 
https://www.heise.de/tests/Abbyy-FineReader-15-OCR-Software-mit-beeindruckender-Texterkennung-4594055.html

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

gimagereader wurde schon erwähnt, ist kostenlos, für Linux und Windows 
erhältlich und kann direkt PDF importieren. Dann kann man die Absätze, 
die erkannt werden sollen nacheinander markieren (ctrl-Taste drücken, 
sonst werden die bisherigen Markierungen wieder gelöscht).

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Ich habe diesen Thread mit Fireshot in PDF gedruckt und mit gimagereader 
einen Ausschnitt erkennen lassen, hier das Ergebnis.

von Dirk (Gast)


Lesenswert?

Wie ich geschrieben hatte kann man erstmal mit gImageReader einen 
Eindruck bekommen, wie die Ergebnisse von Tesseract sind.

Sollten die Ergebnisse ausreichend sein, dann in eine eigene Anwendung 
einbauen und den Bereich vorgeben, also PDF als Bild in den Speicher 
holen und dann den Suchbereich auf das Inmemorybild loslassen.

Mach Dir Gedanken, wie Du 3 OCR's einbindest über eine Abstraktion und 
such Dir noch zwei  kostenpflichtige AI OCR's, dann kannst Du noch die 
Fehler nachdem Ausschlussverfahren ausbügeln.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.