Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# iTextSharp正在解析PDF对象,以删除未使用的对象_C#_Pdf_Itextsharp - Fatal编程技术网

C# iTextSharp正在解析PDF对象,以删除未使用的对象

C# iTextSharp正在解析PDF对象,以删除未使用的对象,c#,pdf,itextsharp,C#,Pdf,Itextsharp,根据问题 我被告知必须有效地解析PDF文件,记下全局对象名,然后删除未使用的对象名 我甚至不知道从哪里开始 我正在VS2010本地查看器中查看,我可以在一个页面中看到一个名为Matrix的数组。这似乎包含页面中使用的XObject。但是矩阵似乎不是API允许的属性 我还在我的阅读器中发现了一个xrefObj数组,它似乎是每个对象。在查看XObject时,我发现了许多大小与实际图像相对应的PRStream对象 iTextSharp.text.pdf.PdfDictionary dictionary

根据问题

我被告知必须有效地解析PDF文件,记下全局对象名,然后删除未使用的对象名

我甚至不知道从哪里开始

我正在VS2010本地查看器中查看,我可以在一个页面中看到一个名为Matrix的数组。这似乎包含页面中使用的XObject。但是矩阵似乎不是API允许的属性

我还在我的阅读器中发现了一个xrefObj数组,它似乎是每个对象。在查看XObject时,我发现了许多大小与实际图像相对应的PRStream对象

iTextSharp.text.pdf.PdfDictionary dictionary = reader.GetPageN(i);

iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, i);


iTextSharp.text.pdf.PdfDictionary res = (iTextSharp.text.pdf.PdfDictionary)iTextSharp.text.pdf.PdfReader.GetPdfObject(dictionary.Get(iTextSharp.text.pdf.PdfName.RESOURCES));

iTextSharp.text.pdf.PdfDictionary xobj = (iTextSharp.text.pdf.PdfDictionary)iTextSharp.text.pdf.PdfReader.GetPdfObject(res.Get(iTextSharp.text.pdf.PdfName.XOBJECT));

foreach (iTextSharp.text.pdf.PdfName name in xobj.Keys)
{
    iTextSharp.text.pdf.PdfObject obj = xobj.Get(name);
    if (obj.IsIndirect())
    {
        iTextSharp.text.pdf.PdfDictionary tg = (iTextSharp.text.pdf.PdfDictionary)iTextSharp.text.pdf.PdfReader.GetPdfObject(obj);
        iTextSharp.text.pdf.PdfName type = (iTextSharp.text.pdf.PdfName)iTextSharp.text.pdf.PdfReader.GetPdfObject(tg.Get(iTextSharp.text.pdf.PdfName.SUBTYPE));
        if (iTextSharp.text.pdf.PdfName.IMAGE.Equals(type))
        {
            int XrefIndex = Convert.ToInt32(((iTextSharp.text.pdf.PRIndirectReference)obj).Number.ToString(System.Globalization.CultureInfo.InvariantCulture));
            iTextSharp.text.pdf.PdfObject pdfObj = reader.GetPdfObject(XrefIndex);
            iTextSharp.text.pdf.PdfStream pdfStream = (iTextSharp.text.pdf.PdfStream)pdfObj;
        }
    }
}
这个块似乎给了我整个资源目录,而不是页面上特定使用的资源

所以我想我想要的是: -如何将PDF文件(我假设我列出了所有的ObjNum)中的引用与阅读器中的主列表相匹配。 -删除所有未保留在“我的引用”列表中的引用并保存到位(这是一个临时文件,所以可以保存到位)


提前感谢。

为了识别页面上的图像,我使用了PdfReaderContentParser

iTextSharp.text.pdf.parser.PdfReaderContentParser parser = new iTextSharp.text.pdf.parser.PdfReaderContentParser(reader);
MyImageRenderListener listener = new MyImageRenderListener();


while (i < numberofPages)
{
   i++;
   parser.ProcessContent(i, listener);
}
我使用原始问题中发布的代码作为主图像列表的基础

public void RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo renderInfo)
{
    iTextSharp.text.pdf.parser.PdfImageObject image = renderInfo.GetImage();
    if (image == null) return;

    ImageNames.Add(renderInfo.GetRef().Number);


}