根据问题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)在文件的每个实际页面上与读者中保存的主列表相对应。 - 删除未保存在我的引用列表中的所有引用并保存到位(这是一个临时文件,因此就可以了。
提前致谢。
答案 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);
}
我使用原始问题中张贴的代码作为主图像列表的基础。