Laden...
Avatar #avatar-3313.jpg
Kedishen myCSharp.de - Member
Ausbildung zum Fachinformatiker für Anwendungsentwicklung Laos Dabei seit 19.10.2011 5 Beiträge
Benutzerbeschreibung

Forenbeiträge von Kedishen Ingesamt 5 Beiträge

02.12.2011 - 16:42 Uhr

Hey Dragon,

danke für die schnelle Antwort. Leider ist das in meinem Fall keine Lösung. Ich werde mich nächste Woche, falls bis dahin noch keine Antwort gefallen ist, mit ein paar Kollegen zusammensetzen und versuchen ein Code-Snippet reinzustellen.
Ich denke damit können die Leute mehr anfangen als mit reinen Angaben.

Das Problem ist, dass das ein Auftrag für eine Firma ist und ich deshalb momentan nicht einfach so einen Code-Teil preisgeben darf.

Ich werde mich dann nochmal melden und danke nochmal für die Antwort.

MfG
Kedishen

01.12.2011 - 10:45 Uhr

Hey Community,

hier bin ich mal wieder und wieder mit iTextSharp. Und zwar habe ich jetzt soweit mit iTextSharp das meiste gemacht und bin auf das folgende Problem gestoßen:

Wenn ich PDFs, bzw. ihren Inhalt, miteinander verbinde (merge) entsteht, ab einer gewissen Vielfalt, eine unverhältnismäßige Vergrößerung der Dateigröße. Z.B.: Bei einer Datei mit 134 Seiten habe ich eine Größe von 62,7MB, was alles andere als optimal ist.

Nach langer Recherche habe ich rausgefunden, dass der Hauptgrund dafür die Schriftarten sind. Beim Verbinden der Seiten werden immer wieder die Schriftarten eingebettet und somit steigt die Dateigröße ins Unermäßliche. Die Lösungen von iTextSharp, wie SetFullCompression() oder Compression = BEST_COMPRESSION habe ich bereits probiert und es hat mir keinen nennenswerten Erfolg gebracht. Wenn ich diese Datei allerdings von Acrobat X optimieren lasse, schrumpft sie auf etwas zwischen 100-200KB.

Meine Fragen zu dem Thema sind nun:

  • Gibt es eine Möglichkeit in .NET eine PDF zu optimieren? (Quasi wie in Acrobat X)
  • Kann man verhindern, dass die Schriftarten immer wieder eingebettet werden?
  • Kommt man im Nachhinein an die Schriftarten ran?

Ich habe bereits alles Mögliche in Google eingetippt und bisher nichts sinnvolles finden können. Das einzige was zum Thema passte, war entweder Acrobat oder andere Entwickler mit dem selben Problem und leider ohne Lösung. Ich würde auch andere Libraries als iTextSharp nutzen wollen und auch, wenn es nicht anders geht, Geld ausgeben.

Da ich vertrauen in diese Community habe, hoffe ich dass ihr mir bald helfen könnt.

MfG
Kedishen

20.10.2011 - 17:11 Uhr

Hey Marko,

danke für die Antwort, aber leider ist die PDF nicht in Felder unterteilt.

Allerdings habe ich jetzt nach längerem Googlen und Lesen doch noch eine Möglichkeit gefunden mit iTextSharp einen ausgewählten Bereich von einer Seite auszuschneiden und den Text daraus auszulesen.

Und wie bereits gesagt, will ich euch das nicht vorenthalten, da ich denke, dass das noch mehrere Leute interessieren könnte.


//Auslesen eines bestimmten Bereiches einer PDF mit iTextSharp
private void ExtractArea(string InputPath, string OutputPath)
        {
            using (Stream inputPdfStream = new FileStream(InputPath, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using (Stream outputPdfStream = new FileStream(OutputPath, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    PdfReader reader = new PdfReader(inputPdfStream);
                    PdfStamper stamper = new PdfStamper(reader, outputPdfStream);
                    System.util.RectangleJ rect = new System.util.RectangleJ(50, 630, 250, 630); //Markiert den Bereich der gelesen werden soll
                    RenderFilter[] rfArea = new RenderFilter[1];
                    rfArea[0] =  new RegionTextRenderFilter(rect);
                    ITextExtractionStrategy strategy;

					Paragraph paragraph = new Paragraph();
					
                    for (int i = 1; i <= reader.NumberOfPages; i++) //Schleife zum durchlaufen mehrere/aller Seiten
                    {
                        strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), rfArea); //Liest nur den markierten Bereich
						paragraph = PdfTextExtractor.GetTextFromPage(reader, 1, strategy); //Überträgt den markierten Text in den Paragraph
                        stamper.Writer.Add(paragraph) //Speichert den Paragraphen
                    }

                    stamper.Close(); //Sobald der Stamper geschlossen wird, wird der Text ausgegeben
                    reader.Close();
                }
            }
        }

Ich hoffe ich habe keinen Fehler gemacht, da ich den Code nochmal ändern musste, weil die Version die ich am Arbeitsplatz verwende schon auf meinen aktuellen Auftrag angepasst wurde.

Auf diese Weise kann man nur Text aus einem Bereich auslesen! Falls Bilder nur zum Teil ausgeschnitten werden sollen oder Ähnliches, weiss ich leider keine Lösung.

Ich hoffe ich kann damit einigen Leuten helfen und bedanke mich nochmal für alle Antworten. 😁

MfG
Kedishen

P.S.: Falls jemand noch einen besseren, anderen, ähnlichen Vorschlag hat, soll er Ihn mir bitte mitteilen. Er sollte aber wenn möglich über iTextSharp laufen.

P.P.S.: @Coffeebean Ich habe deinen Lösungsansatz mit Ghostscript auch einmal ausprobiert, allerdings waren die Grafiken, die ich aus den PDFs erstellt habe, für den Auftrag, den ich bearbeite, zu unscharf. Kann natürlich sein, dass ich da was falsch gemacht habe, war aber trotzdem eine sehr gute Idee. Danke nochmal! 🙂

20.10.2011 - 07:49 Uhr

Hey Coffeebean,

erstmal danke für die schnelle Antwort. Ich denke auch, dass die ganze Geschichte in ein Bild umzuwandeln die einfachste Methode wäre. Muss jetzt nur mal gucken, ob ich da eine Grundsätzlichkeit für die PDFs finde, damit ich die richtigen Briefe ausschneiden kann.

Wie dem auch sei, danke nochmal und ich hoffe es kommen evtl. noch ein paar Ideen. Die anderen Libraries werde ich auch mal ausprobieren. Wenn ich da was finden sollte, bzw. das Problem lösen sollte, werde ich das nochmal posten. Ich denke das könnte mehrere Leute interessieren.

MfG
Kedishen

19.10.2011 - 16:18 Uhr

Hey MyCSharp-Community,

das ist mein erster Post hier, obwohl ich hier schon öfters auf ein paar Problemlösungen, bzw. gute Ansätze gestoßen bin. Diesmal dachte ich, probier ich es mal mit einer Frage.

Ich bin momentan dabei mich in iTextSharp einzuarbeiten, weil meine Firma, in der ich ausgebildet werde, viel mit PDFs arbeitet. Derweil ist es so, dass ich die Aufgabe bekommen habe das Anschriftfeld aus einer PDF-Datei auszuschneiden und auf einer anderen Seite wieder einzufügen. Also nicht nur den blanken Text, sondern eher wie eine Grafik.
Damit jeder weiss worum es sich dabei handelt, da steht sowas wie:

Herr
Max Mustermann
Muster Str. 42
11111 Musterstadt
DEUTSCHLAND

Mein erster Ansatz war, einfach den Text auszulesen und die entsprechenden Zeilen zu übertragen. Allerdings soll das in Zukunft automatisiert laufen und wenn mal eine Anpassung an den Dateien gemacht wird, könnte es sein, dass das Programm nicht mehr läuft.
Also dachte ich, ich könnte evtl. einen Bereich der Datei festmachen, den ich dann ausschneide und auf einer anderen Seite wieder einfüge. Da die Koordinaten für diesen Bereich auf jedem Brief die gleichen wären, ist das denke ich die beste, bzw. langfristigste Lösung.
Da es keine Dokumentation zu iTextSharp gibt (bzw. keine "for free"), bin ich am rätseln wie ich das erreichen könnte. Google sowie eure Suchfunktion konnte mir zu der Thematik nichts helfendes darbieten und leider kann ich euch auch keine Code-Snippets zeigen, da noch nichts festes besteht.

Ich hoffe ihr könnt mir ein paar Anhaltspunkte geben, bzw. mir sagen mit welchen Funktionen von iTextSharp ich dieses Ziel erreichen kann. Wenn ihr eine andere Library im Sinn habt, wäre das auch in Ordnung, hauptsache sie läuft unter C#.

Vielen Dank im Voraus und ich verbleibe

MfG
Kedishen