Problem beim Entfernen von Inline-Bildern aus PDF mit iTextSharp

Ich habe vor kurzem iTextSharp entdeckt.

Ich habe ein Leistungsproblem beim Rendern von PDF-Dokumenten untersucht und Bruno Lowagie (Autor von iText) hat mir freundlicherweise den Grund für dieses Problem erläutert: Es lag an der Menge an "Inline-Bildern" in meinen PDF-Dokumenten. Er erklärte auch die Grundlagen zum Entfernen dieser "Inline-Bilder". Ich verstehe klar, dass das, was ich versuche, alles andere als robust / sicher ist ... Das Problem muss auf einer anderen Ebene gelöst werden, z.

Leider gelingt es mir nicht, die Bereinigung selbst durchzuführen: / Hier ist ein Code, den ich derzeit habe (inspiriert von verschiedenen Beispielen, die auf stackOverflow gefunden wurden) ...

PdfReader pdfReader = new PdfReader(filename);
try
{  
    //pdfReader.RemoveUnusedObjects();

    var cleanfilename = filename.Replace(".pdf", ".clean.pdf");
    if (File.Exists(cleanfilename))
        File.Delete(cleanfilename);

    using (var file = new FileStream(cleanfilename, FileMode.Create))
    {
        var pdfstamper = new PdfStamper(pdfReader, file);

        for (var page = 1; page <= pdfReader.NumberOfPages; page++)
        {    
            PdfDictionary pageDict = pdfReader.GetPageN(page);
            PdfObject pageObj = pageDict.GetDirectObject(PdfName.CONTENTS);
            if (pageObj.IsStream())
            {
                CleanStream(pageObj);
            }
            else if (pageObj.IsArray())
            {
                PdfArray pageArray = pageDict.GetAsArray(PdfName.CONTENTS);

                for (int j = 0; j < pageArray.Size; j++)
                {
                    PdfIndirectReference arrayElement = (PdfIndirectReference)pageArray[j];
                    pageObj = pdfReader.GetPdfObject(arrayElement.Number);
                    if (pageObj.IsStream())
                    {
                        CleanStream(pageObj);
                    }
                }
            }
        }

        pdfstamper.Close();
    }
}
catch (Exception ex)
{
    MessageBox.Show("Error: " + ex.Message, "Error");
}
finally
{
    pdfReader.Close();
}

und

Regex regEx = new Regex("\\nBI.*?\\nEI", RegexOptions.Compiled);

private void CleanStream(PdfObject obj)
{
    var stream = (PRStream)obj;
    var data = PdfReader.GetStreamBytes(stream);

    var currentContent = Encoding.ASCII.GetString(data);    
    var newContent = regEx.Replace(currentContent, "");
    var newData = Encoding.ASCII.GetBytes(newContent);

    stream.SetData(newData);
}

Bei PDF-Dateien ohne Inline-Bilder funktioniert dies einwandfrei. Auf Seiten mit Inline-Bildern wird jedoch kein Text mehr angezeigt.

Ich dachte, das Problem sei mit dem Ersatz. Soweit ich das beurteilen kann, ist dies jedoch nicht der Fall. Mit dem folgenden Code (Art des Passthrough) ist das Ausgabedokument in Ordnung:

private void CleanStream(PdfObject obj)
{
    var stream = (PRStream)obj;
    var data = PdfReader.GetStreamBytes(stream);

    stream.SetData(data);
}

Wenn Sie jedoch den folgenden Code verwenden, der theoretisch kein Byte ändert (oder?), Werden die Ausgabedokumente nicht mehr korrekt angezeigt (einige Inhalte scheinen nicht gerendert zu sein)?!?!?

private void CleanStream(PdfObject obj)
{
    var stream = (PRStream)obj;
    var data = PdfReader.GetStreamBytes(stream);

    var currentContent = Encoding.ASCII.GetString(data);    
    var newData = Encoding.ASCII.GetBytes(currentContent);

    stream.SetData(newData);
}

Ich sehe aus wie die Umwandlung des Byte-Arrays in eine Zeichenfolge und zurück in ein Array ist keine "transparente" Operation.

Ich verstehe es wirklich nicht!?! Andererseits weiß ich, dass ich in Bezug auf PDF ein echter Anfänger bin. Was vermisse ich ?

Dies ist überhaupt nicht kritisch (es ist mir egal, ob es mir nicht gelingt, diese Inline-Bilder zu entfernen). Aber jetzt bin ich wirklich neugierig, was passiert: D

Hier ist ein PDF-Beispiel:https://drive.google.com/file/d/0Byqch0ZyIb5DWDdmSTJ3SDMxMW8/edit?usp=sharing

Antworten auf die Frage(2)

Ihre Antwort auf die Frage