使用itextsharp 5剪切pdf会导致损坏的PDF

时间:2018-09-26 15:42:31

标签: c# pdf itext

我想使用itextsharp 5读取PDF文件,并用原始PDF每页的左半部分创建一个新的PDF文件,而丢弃右半部分。我编写了以下代码,但结果已损坏,无法使用Acrobat Reader打开(尽管可以用Chrome打开它)。如何制作可与Acrobat Reader一起使用的PDF?

private byte[] ObtenerMitadPdf(byte[] Contenido)
    {
        using (var pdfReader = new PdfReader(Contenido))
        {
            using (var memoryStream = new MemoryStream())
            {
                using (var documento = new Document())
                using (var pdfWriter = PdfWriter.GetInstance(documento, memoryStream))
                {
                    pdfWriter.CloseStream = false;
                    documento.Open();
                    for (int i = 1; i <= pdfReader.NumberOfPages; i++)
                    {
                        var pagina = pdfWriter.GetImportedPage(pdfReader, i);
                        var tamañoPagina = pdfReader.GetPageSizeWithRotation(i);
                        var nuevoTamaño = new Rectangle(tamañoPagina.Left, tamañoPagina.Bottom,
                            tamañoPagina.Left + (tamañoPagina.Width / 2), tamañoPagina.Top, tamañoPagina.Rotation);
                        if (tamañoPagina.Rotation == 90)
                        {
                            pdfWriter.DirectContent.AddTemplate(pagina, 0, -1, 1, 0, 0, tamañoPagina.Height);
                        }
                        else
                        {
                            pdfWriter.DirectContent.AddTemplate(pagina, 0, 0);
                        }
                        documento.SetPageSize(nuevoTamaño);
                        documento.NewPage();
                    }
                }
                return memoryStream.ToArray();
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我终于设法使其正常工作!

private byte[] ObtenerMitadPdf(byte[] Contenido)
    {
        using (var pdfReader = new PdfReader(Contenido))
        {
            using (var memoryStream = new MemoryStream())
            {
                using (var stamper = new PdfStamper(pdfReader, memoryStream))
                {
                    for (int i = 1; i <= pdfReader.NumberOfPages; i++)
                    {
                        var pagina = pdfReader.GetPageN(i);
                        var tamañoPagina = pdfReader.GetPageSizeWithRotation(i);
                        var mediaBox = new PdfRectangle(tamañoPagina.Left, tamañoPagina.Bottom,
                            tamañoPagina.Left + (tamañoPagina.Width / 2), tamañoPagina.Top, tamañoPagina.Rotation);
                        pagina.Put(PdfName.MEDIABOX, mediaBox);
                        stamper.MarkUsed(pagina);
                    }
                }
                return memoryStream.ToArray();                   
            }
        }
    }