ItextSharp возвращает поврежденный файл после редактирования существующего файла PDF - PullRequest
0 голосов
/ 10 ноября 2018

Я новичок в itextSharp. Что я делаю, так это просто редактирую старый файл и вместо того, чтобы сохранять новый файл на сервере, я просто хочу, чтобы он загружался в то время. но, к сожалению, после редактирования файла и его загрузки, файл с сообщением не может открыть файл. Может быть поврежден .

Вот мой код.

public FileStreamResult export( int ? id)
    {
        string pathin = Server.MapPath(Url.Content("~/PDF/input.pdf"));


        PdfReader reader = new PdfReader(pathin);
        iTextSharp.text.Rectangle size = reader.GetPageSizeWithRotation(1);
        Document document = new Document(size);

        // open the writer
        //FileStream ms = new FileStream(pathout, FileMode.Create, FileAccess.Write);
        var ms = new MemoryStream();
        PdfWriter writer = PdfWriter.GetInstance(document, ms);
        writer.CloseStream = false;
        document.Open();

        // the pdf content
        PdfContentByte cb = writer.DirectContent;

        // select the font properties
        BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
        cb.SetColorFill(BaseColor.DARK_GRAY);
        cb.SetFontAndSize(bf, 18f);

        // write the text in the pdf content
        cb.BeginText();
        string text = "this is text";
        // put the alignment and coordinates here
        cb.ShowTextAligned(1, text, 500, 500, 0);
        cb.EndText();
        cb.BeginText();
        text = "this is my post";
        // put the alignment and coordinates here
        cb.ShowTextAligned(1, text, 600, 400, 0);
        cb.EndText();

        // create the new page and add it to the pdf
        PdfImportedPage page = writer.GetImportedPage(reader, 1);
        cb.AddTemplate(page, 0, 0);


        ms.Position = 0;
        document.Close();
        //ms.Close();

        writer.Close();
        reader.Close();


        return File(ms, "application/pdf","test.pdf");
    }

Любая помощь будет по достоинству оценена. :)

1 Ответ

0 голосов
/ 10 ноября 2018

Вы изменяете позицию потока памяти перед закрытием документа:

    ms.Position = 0;
    document.Close();

Поскольку трейлер pdf в потоке результатов записывается во время закрытия документа, изменение позиции потока приводит к тому, что трейлер pdf записывается поверх заголовка pdf, а затем позиция потока не будет в начале.

Вместо этого сначала закройте документ и устройство чтения (устройство записи неявно закрывается при закрытии документа) и после этого сбросьте позицию потока:

    document.Close();
    reader.Close();

    ms.Position = 0;
    return File(ms, "application/pdf","test.pdf");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...