使用iTextSharp进行一些压缩后损坏的pdf

时间:2015-07-10 07:19:00

标签: pdf compression itextsharp image-compression

以下代码首先创建一个.pdf,这是正常的,看起来很完美,我已从该网站上的其他帖子中获取了其余代码(进行压缩)。问题是compressed.pdf文件是1kb,而acrobat说文件已损坏且无法修复。我之前从未制作过pdf压缩器。请查看我的代码,如果有可能提供一些更正以使其正常工作。

private void btnEndScan_Click(object sender, EventArgs e)
    {
        Document doc1 = new Document(PageSize.A4, 0, 0, 0, 0);
        string filename = "Prot_" + label.Text + ".pdf"; 
        try
        {
            PdfWriter.GetInstance(doc1, new FileStream("C:/" + filename, FileMode.Create));

            doc1.Open();
            for (int i = 0; i < imageArray.Length; i++)
            {
                iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance(imageArray[i], System.Drawing.Imaging.ImageFormat.Bmp);
                pic.ScalePercent(36f);
                doc1.Add(pic);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error creating pdf file" + ex);
        }
        finally
        {
            doc1.Close();

            PdfReader reader = new PdfReader("C:/" + filename);
            string filepath = "C:/compressed/" + filename;
            using (MemoryStream ms = new MemoryStream())
            {
                    PdfStamper stamper = new PdfStamper(reader, ms, PdfWriter.VERSION_1_5);
                    PdfWriter writer = stamper.Writer;
                    writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
                    reader.RemoveFields();
                    reader.RemoveUnusedObjects();
                    stamper.Reader.RemoveUnusedObjects();
                    stamper.SetFullCompression();
                    stamper.Writer.SetFullCompression();
                    byte[] compressed = ms.ToArray();
                    reader.Close();
                    stamper.Close();
                    using (FileStream fs = File.Create("C:/compressed/compressed.pdf"))
                    {
                        fs.Write(compressed, 0, (int)compressed.Length);
                        fs.Close();
                    }
           }
        }
    }

1 个答案:

答案 0 :(得分:1)

你的文件太短了。

看看以下几行:

byte[] compressed = ms.ToArray();
reader.Close();
stamper.Close();

他们应该这样订购:

stamper.Close();
reader.Close();
byte[] compressed = ms.ToArray();

代码中的顺序错误,因为:

  • 您应该在reader之后关闭stamper,因为stamper可能需要在关闭时访问reader
  • 该文件仅在您关闭stamper时完成。在您创建byte[]时,并非所有PDF数据都已写入。该文件不完整。

由于byte[]不完整,您执行此操作时会删除文件的大部分内容:

fs.Write(compressed, 0, (int)compressed.Length);

compressed.Length的值太短。您的实际文件具有更大的文件大小。