错误“参数无效". [英] error of "Parameter is not valid".

查看:105
本文介绍了错误“参数无效".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用iTextSharp将pdf转换为图像.

何时进入:System.Drawing.Image img = System.Drawing.Image.FromStream(memStream);

出现错误:参数无效.

编辑-将OP的代码从解决方案"部分移至此处.

这是代码,希望您能进一步理解我的问题.谢谢!

I use iTextSharp to convert pdf to image.

When go to : System.Drawing.Image img = System.Drawing.Image.FromStream(memStream);

It have error :Parameter is not valid.

Edit - Moved OP''s code here from Solution section.

This is code,I hope you more understand my question.Thanks!!

public static void ExtractImagesFromPDF(string sourcePdf, string outputPath)
{
    // NOTE:   This will only get the first image it finds per page.
    PdfReader pdf = new PdfReader(sourcePdf);
    RandomAccessFileOrArray raf = new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf);
 
    try
    {
        for (int pageNumber = 1; pageNumber <= pdf.NumberOfPages; pageNumber++)
        {
          PdfDictionary pg = pdf.GetPageN(pageNumber);
          PdfDictionary res =
          (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
          PdfDictionary xobj =
          (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
            if (xobj != null)
             {
               foreach (PdfName name in xobj.Keys)
               {
                 PdfObject obj = xobj.Get(name);
                  if (obj.IsIndirect())
                  {
                    PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
                    PdfName type =
                    (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
                      if (PdfName.IMAGE.Equals(type))
                      {
 
                      int XrefIndex = Convert.ToInt32(((PRIndirectReference)obj).Number.ToString(System.Globalization.CultureInfo.InvariantCulture));
                      PdfObject pdfObj = pdf.GetPdfObject(XrefIndex);
                      PdfStream pdfStrem = (PdfStream)pdfObj;
                      byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)pdfStrem);
                      if ((bytes != null))
                      {
                        using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(bytes))
                        {
                          memStream.Position = 0;
                          System.Drawing.Image img = System.Drawing.Image.FromStream(memStream,true, false);
                          // must save the file while stream is open.
                           if (!Directory.Exists(outputPath))
                           Directory.CreateDirectory(outputPath);
 
                           string path = Path.Combine(outputPath, String.Format(@"{0}.jpg", pageNumber));
                           System.Drawing.Imaging.EncoderParameters parms = new System.Drawing.Imaging.EncoderParameters(1);
                           parms.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, 0);
// GetImageEncoder is found below this method
                           System.Drawing.Imaging.ImageCodecInfo jpegEncoder = GetImageEncoder("JPEG");
                           img.Save(path, jpegEncoder, parms);
                           break;



请给我一个解决方案!
谢谢.



Pls give me a solution!!
Thanks.

推荐答案

如果memStream是流,那么它的代码就很好了,就是这样,它是从抽象类型System.IO.Stream派生的. .如果这导致错误,则不是.但是,您没有指定错误"是什么:编译错误或运行时异常.

(看起来,问这样的问题不是很好.您喜欢谜语吗?为什么我们看不到您可以轻易看到的东西.您需要发布确切的错误或异常信息,指出相关的代码行,并知道显示多少代码.在您的帖子中,这肯定是不够的.这就是为什么我必须做一些猜测的原因.)

这是东西.您尝试做的事情无助于将PDF转换为图像.当您有一个Image.FromStream可以读取的流时,您需要具有该流的内容,该内容应该是一种有效图像格式(例如PNG或JPG)中的图像.如果您的问题是PDF,我认为您没有.您原则上正在尝试做错事;这是问题的根本原因.

—SA
This code looks fine if the memStream is a stream, that''s it, it''s derived from the abstract type System.IO.Stream. If this cause an error, this is not. However, you did not specify what''s an "error": a compilation error or run-time exception.

(Look, this is not nice to ask such questions. Do you like riddles? Why we cannot see what you can easily see. You need to post exact error or exception information, indicate relevant lines of code and know how much code to show. In your post, it''s certainly not enough. That''s why I have to do some guesswork.)

Here is the thing. What you are trying to do cannot help to convert PDF to image. When you have a stream which can be read by Image.FromStream, you need to have the content of the stream which should be an image in one of the valid image formats like PNG or JPG. I don''t think you have it, if your problem is PDF. You are trying to do something wrong in principle; and this is a root cause of your problem.

—SA


这是代码,希望您能进一步理解我的问题.谢谢!

公共静态void ExtractImagesFromPDF(字符串sourcePdf,字符串outputPath)
{
//注意:这只会获得每页找到的第一张图像.
PdfReader pdf =新的PdfReader(sourcePdf);
RandomAccessFileOrArray raf =新的iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf);

试试
{
for(int pageNumber = 1; pageNumber< = pdf.NumberOfPages; pageNumber ++)
{
PdfDictionary pg = pdf.GetPageN(pageNumber);
PdfDictionary res =
(PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobj =
(PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
如果(xobj!= null)
{
foreach(xobj.Keys中的PdfName名称)
{
PdfObject obj = xobj.Get(名称);
如果(obj.IsIndirect())
{
PdfDictionary tg =(PdfDictionary)PdfReader.GetPdfObject(obj);
PdfName类型=
(PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
如果(PdfName.IMAGE.Equals(type))
{

int XrefIndex = Convert.ToInt32((((PRIndirectReference)obj).Number.ToString(System.Globalization.CultureInfo.InvariantCulture));
PdfObject pdfObj = pdf.GetPdfObject(XrefIndex);
PdfStream pdfStrem =(PdfStream)pdfObj;
byte [] bytes = PdfReader.GetStreamBytesRaw((PRStream)pdfStrem);
如果((bytes!= null))
{
使用(System.IO.MemoryStream memStream = new System.IO.MemoryStream(bytes))
{
memStream.Position = 0;
System.Drawing.Image img = System.Drawing.Image.FromStream(memStream,true,false);
//必须在流打开时保存文件.
如果(!Directory.Exists(outputPath))
Directory.CreateDirectory(outputPath);

字符串路径= Path.Combine(outputPath,String.Format(@"{0} .jpg",pageNumber));
System.Drawing.Imaging.EncoderParameters参数=新的System.Drawing.Imaging.EncoderParameters(1);
parms.Param [0] =新的System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression,0);
//GetImageEncoder在此方法下找到
System.Drawing.Imaging.ImageCodecInfo jpegEncoder = GetImageEncoder("JPEG");
img.Save(path,jpegEncoder,parms);
休息;
This is code,I hope you more understand my question.Thanks!!

public static void ExtractImagesFromPDF(string sourcePdf, string outputPath)
{
// NOTE: This will only get the first image it finds per page.
PdfReader pdf = new PdfReader(sourcePdf);
RandomAccessFileOrArray raf = new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdf);

try
{
for (int pageNumber = 1; pageNumber <= pdf.NumberOfPages; pageNumber++)
{
PdfDictionary pg = pdf.GetPageN(pageNumber);
PdfDictionary res =
(PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobj =
(PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
if (xobj != null)
{
foreach (PdfName name in xobj.Keys)
{
PdfObject obj = xobj.Get(name);
if (obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
PdfName type =
(PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
if (PdfName.IMAGE.Equals(type))
{

int XrefIndex = Convert.ToInt32(((PRIndirectReference)obj).Number.ToString(System.Globalization.CultureInfo.InvariantCulture));
PdfObject pdfObj = pdf.GetPdfObject(XrefIndex);
PdfStream pdfStrem = (PdfStream)pdfObj;
byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)pdfStrem);
if ((bytes != null))
{
using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(bytes))
{
memStream.Position = 0;
System.Drawing.Image img = System.Drawing.Image.FromStream(memStream,true, false);
// must save the file while stream is open.
if (!Directory.Exists(outputPath))
Directory.CreateDirectory(outputPath);

string path = Path.Combine(outputPath, String.Format(@"{0}.jpg", pageNumber));
System.Drawing.Imaging.EncoderParameters parms = new System.Drawing.Imaging.EncoderParameters(1);
parms.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, 0);
// GetImageEncoder is found below this method
System.Drawing.Imaging.ImageCodecInfo jpegEncoder = GetImageEncoder("JPEG");
img.Save(path, jpegEncoder, parms);
break;


这篇关于错误“参数无效".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆