iTextsharp Pdf aufteilen. Ausgabe-Teil ist zu groß.

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Plohich.

    iTextsharp Pdf aufteilen. Ausgabe-Teil ist zu groß.

    Hallo Freunde,
    kann mir jemand bei itextsharp helfen? Ich benutze Vers. 5.5.8.0

    Folgendes Problem, ich habe ein PDF mit 100 Seiten und möchte ihn auf mehrere Teile aufteilen, z.B. zwei Seiten pro Teil. Das hat funktioniert, aber das Ergebnis hat mich verwirrt. Test.pdf war 5mb groß, aber das Ergebnis, jedes Teil hat 5mb gehabt. Also Input --> 5mb, Output --> 5mb x 50…
    Ich bin kein Programmierer, ich versuche mir nur das Leben mit Programmierung leichter zu machen, bitte nicht gleich mit Steinen bewerfen wegen meines Codes ^^ Was mache ich falsch?

    Vielen Dank im Voraus!

    P.S. es tut mir leid, ich habe leider der Beitrag im falsche Thema erstellt und kann es jetzt nicht verschieben. :huh:

    C#-Quellcode

    1. public static int TeilePdfInTeile(string filePdf, string OPT_OUTPUT, int iPage)
    2. {
    3. int currentFile = 0;
    4. FileInfo filePdfInfo = new FileInfo(filePdf);
    5. if (File.Exists(filePdf))
    6. {
    7. using (var pdfReader = new PdfReader(filePdf))
    8. {
    9. int iCurrentPage = 0;
    10. int iCurrentFile = 0;
    11. var pages = new List<int>();
    12. Dictionary<string, List<int>> seitenNeuePdf = new Dictionary<string, List<int>>();
    13. for (var page = 1; page <= pdfReader.NumberOfPages; page++)
    14. {
    15. iCurrentPage++;
    16. pages.Add(page);
    17. if (iCurrentPage == iPage)
    18. {
    19. iCurrentFile++;
    20. iCurrentPage = 0;
    21. seitenNeuePdf.Add(iCurrentFile.ToString("00000"), pages);
    22. pages = new List<int>();
    23. }
    24. }
    25. foreach (var oneSendung in seitenNeuePdf)
    26. {
    27. var doc = new iTextSharp.text.Document();
    28. var copie = new iTextSharp.text.pdf.PdfCopy(doc, new System.IO.FileStream(OPT_OUTPUT + filePdfInfo.Name.Substring(0, filePdfInfo.Name.Length - 4) + "_" + oneSendung.Key + ".pdf", FileMode.Create));
    29. doc.Open();
    30. var newPages = new List<int>();
    31. newPages = oneSendung.Value;
    32. if (newPages.Count == 1)
    33. {
    34. copie.AddPage(copie.GetImportedPage(pdfReader, newPages[0]));
    35. }
    36. else
    37. {
    38. for (int i = 1; i <= newPages.Count; i++)
    39. {
    40. copie.AddPage(copie.GetImportedPage(pdfReader, newPages[i - 1]));
    41. }
    42. }
    43. copie.Close();
    44. doc.Close();
    45. currentFile++;
    46. }
    47. }
    48. }
    49. else
    50. {
    51. currentFile = 0;
    52. return currentFile;
    53. }
    54. return currentFile;
    55. }


    Verschoben. ~Thunderbolt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    Hallo @Plohich

    Zuerst zu deinem Code
    Ich würde Zeile 17 noch ergänzen, damit bei ungerader Anzahl Seiten auch der Rest exportiert wird.

    C#-Quellcode

    1. if (iCurrentPage == iPage | page == pdfReader.NumberOfPages)


    Zu deinem Problem:
    Ich glaube nicht,dass das Problem an deinem Code liegt, sondern an der PDF-Datei selbst.
    Guckst du hier: itext.2136553.n4.nabble.com/Re…First-Page-tp4660563.html

    Gruss HenryV
    @Plohich Willkommen im Forum. :thumbup:
    Wieviele solcher Dokumente willst Du zerhackstückeln?
    Warum nimmst Du nicht die schnöde Druckfunktion vom Adobe?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank an alle!!!

    Es scheint tatsächlich dass Code richtig ist. Ich habe Gestern mehrere Aussagen im Internet gefunden, dass die Ressourcen welche sich im Input-Pdf befinden, in jede neue erstellte Teil noch mal geschrieben werden. Das finde ich blöd...
    Man kann sich, aber helfen wenn man Pdf vorher in eine andere Pdf-Version mit Hilfe von gswin32c.exe konvertiert. Dann habe ich konvertierte Pdf aufgeteilt und das Ergebnis war fast 1:1. Es ist aber nicht ganz saubere Lösung, durch solche Konvertierungen können manche Schriftarten ausgetauscht werden.

    So habe ich es konvertiert:

    "C:\Program Files (x86)\gs\gs8.70\bin\gswin32c.exe" -dPDFA -sDEVICE=pdfwrite -od:\ok\input.PDF d:\fehler\output.PDF

    @RodFromGermany Mit Adobe wird es nicht funktionieren. Diese Prozesse müssen dann später auf dem Server automatisch laufen. Wir arbeiten momentan mit ceTe.DynamicPDF, funktioniert perfekt. Aber dann habe ich festgestellt dass manche Prozesse mit itextsharp bis zu 500% schneller laufen. Jetzt versuche ich alles was wir in mehrere Jahren implementiert haben umzuschreiben.

    @HenryV Ja, Du hast Recht. Dieser Pdf hat viele Farbfotos gehabt und wenn ich ein Pdf nur mit Text aufteile, oder wie ich vorher beschrieben habe (Konvertierung), dann werden Input- und Output-Pdfs fast gleiche Größe haben.

    Viele Grüße,
    Plohich