如何在C#中将PDF转换为图像?

时间:2018-07-10 11:09:19

标签: c# asp.net-mvc image pdf itext

我想将pdf页面转换为png格式。我知道我的代码不正确,但是我找不到该怎么办。另外,我只想使用iTextSharp。

以下是源代码:

    public void PDFDisplay(string DosyaAdi, int PerNr, int ID, int FileId, string message)
    {

        string filepath = Server.MapPath(@"~/Content/Egitim/Files/") + DosyaAdi;
        PdfReader pdfReader = new PdfReader(filepath);
        int numberOfPages = pdfReader.NumberOfPages;
        string path = Server.MapPath(@"~/Content/Egitim/Slides/" + DosyaAdi + "/");
        Directory.CreateDirectory(path);

        System.Drawing.Image[] image1 = new System.Drawing.Image[numberOfPages];
        for (int i = 1; i < numberOfPages; i++)
        {
            byte[] pdfPage = pdfReader.GetPageContent(i);
            using (MemoryStream ms = new MemoryStream(pdfPage))
            {
                image1[i] = System.Drawing.Image.FromStream(ms);//error occurs here. Invalid parameter (ms)
            }
            image1[i].Save(path, System.Drawing.Imaging.ImageFormat.Png);

        }

任何想法都会感激,谢谢。

1 个答案:

答案 0 :(得分:1)

您假设iText可以将PDF语法(矢量数据)转换为图像(光栅图像)。这个假设是错误的。 iText不会将PDF转换为图像!

您正在使用GetPageContent()方法。此方法获取页面的内容流。该内容流由可更改图形状态和文本状态并定义在页面上绘制内容的运算符和操作数组成。

但是,此页面流远远不足以绘制页面,因为每个页面还引用了大量资源:

  • 图像通常存储在单独的PDF对象中。页面流引用了它们,但不包含它们。
  • 语法的一部分可以存储在称为 Form XObject 的外部对象中。页面流引用这些外部对象,但不包含它们。
  • 注释(例如,表单字段的小部件注释,文本注释等)不属于页面流。注释被添加为页面顶部的一层。页面字典的/Annots条目是指特定页面上的注释。
  • 字体永远不会成为页面流的一部分。语法通过名称来引用字体,该名称是页面资源的/Fonts条目的条目。
  • ...

简而言之:您的代码无法正常工作是正常的。您的问题“如何在c#中将PDF转换为图像?”的答案。是:不适用于iText!

如果您将问题更改为:我可以改用哪种工具,那么您的问题就不合时宜了,因为Stack Overflow FAQ明确指出您无法发布问题,以寻求有关工具库的建议。 ..