【问题标题】:Clipping pdf with itextsharp 5 results in a corrupt PDF使用 itextsharp 5 剪切 pdf 会导致 PDF 损坏
【发布时间】:2018-09-26 15:42:30
【问题描述】:

我想使用 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();
            }
        }
    }

【问题讨论】:

  • 请不要将var pdfWriter = PdfWriter.GetInstance(documento, memoryStream) 放入using 块中。关闭Document 将隐式关闭PdfWriter。除了您的方法过于复杂之外,您可以简单地更改PdfReader 的裁剪框并使用`PdfStamper` 编写该版本。
  • 如何使用 PdfReader 设置裁剪框?是否考虑轮换?

标签: c# pdf itext


【解决方案1】:

我终于设法让它工作了!

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();                   
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2014-11-12
    • 2011-01-12
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多