iTextSharp解析PDF对象,以便删除未使用的对象

时间:2013-12-03 00:20:19

标签: c# pdf itextsharp

根据问题Remove unused image objects

我被告知我实际上必须解析PDF文件,记下全局对象名称,然后删除那些未使用的文件。

我甚至不知道从哪里开始。

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

我在读者中也发现了一个xrefObj数组,它似乎是每个对象。在查看XObjects时,我发现了许多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)在文件的每个实际页面上与读者中保存的主列表相对应。 - 删除未保存在我的引用列表中的所有引用并保存到位(这是一个临时文件,因此就可以了。

提前致谢。

1 个答案:

答案 0 :(得分:2)

因此,为了识别页面上的图像,我使用了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);
}

MyImageRenderListener是一个继承的新类:iTextSharp.text.pdf.parser.IRenderListener

我所做的只是将所有名称添加到可从原始类访问的列表中:“

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);


}

我使用原始问题中张贴的代码作为主图像列表的基础。

相关问题