c#如何使用iTextsharp从pdf返回一个字节数组

kay*_*yze 3 c# pdf tiff itextsharp

所有,

我创建了以下方法来获取具有多个tiff页面文档的tiff字节数组

我需要将其转换为pdf,然后返回一个pdf字节数组

我有这个代码1的 2个问题 - 我想返回一个字节[].2 - 生成的pdf重复页面.

    public void convertImage(byte[] documentContent)
    {
        Document document = new Document(PageSize.LETTER, 0, 0, 0, 0);

        PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(@"C:\Data\Output.pdf", FileMode.Create)); --for testing purposes



        Bitmap oldImage;

        using (var ms = new MemoryStream(documentContent))
        {
            oldImage = new Bitmap(ms);
        }


        Size newSize = new Size(1024, 737);


        using (Bitmap bmp1 = new Bitmap(oldImage, newSize))
        {
            int total = oldImage.GetFrameCount(FrameDimension.Page);

            document.Open();

            PdfContentByte cb = writer.DirectContent;

            for (int k = 0; k < total; ++k)
            {
                bmp1.SelectActiveFrame(FrameDimension.Page, k);

                iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(bmp1, ImageFormat.Bmp);

                var scaleparcent = 72f / img.DpiX * 100;

                img.ScalePercent(scaleparcent);

                img.ScaleAbsoluteHeight(document.PageSize.Height);
                img.ScaleAbsoluteWidth(document.PageSize.Width);

                img.SetAbsolutePosition(0, 0);

                cb.AddImage(img);

                document.NewPage();

            }
        }

        byte[] bytes = null;

        document.Close();
    }
Run Code Online (Sandbox Code Playgroud)

有人帮忙吗?

Bru*_*gie 6

这是一个基本的例子:

private byte[] CreatePdf()
{
    Document document = new Document();
    using (MemoryStream ms = new MemoryStream())
    {
        PdfWriter.GetInstance(document, ms);
        document.Open();
        document.Add(new Paragraph("Hello World"));
        document.Close();
        return ms.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

它类似于以前的答案,但在没有明确表示你需要这个答案Close()document实例之前,你从一开始的字节MemoryStream.在您的代码段中,您有:

byte[] bytes = null;
document.Close();
Run Code Online (Sandbox Code Playgroud)

根据之前的答案,您可以将其更改为:

byte[] bytes = ms.ToArray();
document.Close();
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为bytes数组不包含完整的PDF.之后document.Close(),许多基本数据被写入输出流(信息字典,根字典,交叉引用表).

更新:

在C#中,可以自定义使用,using如注释中所示:

private byte[] CreatePdf()
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (Document document = new Document())
        {
            PdfWriter.GetInstance(document, ms);
            document.Open();
            document.Add(new Paragraph("Hello World"));
        }
        return ms.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的论点是document需要关闭才能获得完整的PDF仍然有效:document实例}之前由右边隐式关闭return ms.ToArray().