天天看點

PDF去水印資源索引

1、用iTextSharp去除文字水印。(水印文字需在contents中)

2、用iTextSharp去除圖檔水印。(水印圖檔需為xobject對象)

example code:

<code>using</code> <code>System;</code>

<code>using</code> <code>System.Collections.Generic;</code>

<code>using</code> <code>System.Linq;</code>

<code>using</code> <code>System.Text;</code>

<code>using</code> <code>System.IO;</code>

<code>using</code> <code>iTextSharp.text;</code>

<code>using</code> <code>iTextSharp.text.pdf;</code>

<code> </code> 

<code>namespace</code> <code>ClearWatermark</code>

<code>{</code>

<code>    </code><code>class</code> <code>Program</code>

<code>    </code><code>{</code>

<code>        </code><code>static</code> <code>void</code> <code>Main(</code><code>string</code><code>[] args)</code>

<code>        </code><code>{</code>

<code>            </code><code>string</code> <code>pathfile_in = </code><code>"D:\\test\\input\\test.pdf"</code><code>; </code>

<code>            </code><code>string</code> <code>pathfile_out = </code><code>"D:\\test\\output\\test.pdf"</code><code>; </code>

<code>             </code> 

<code>            </code><code>ProcOne4Contents(pathfile_in, pathfile_out);</code>

<code>            </code><code>ProcOne4Xobject(pathfile_in, pathfile_out);</code>

<code>            </code><code>Console.ReadKey();</code>

<code>        </code><code>}       </code>

<code>        </code><code>//去文字水印示例(walker)</code>

<code>        </code><code>static</code> <code>bool</code> <code>ProcOne4Contents(</code><code>string</code> <code>pathfile_in, </code><code>string</code> <code>pathfile_out)</code>

<code>            </code><code>PdfReader pdfReader = </code><code>new</code> <code>PdfReader(pathfile_in);</code>

<code>            </code><code>PRStream stream;</code>

<code>            </code><code>String content;</code>

<code>            </code><code>PdfDictionary page;</code>

<code>            </code><code>PdfArray contentarray;</code>

<code>            </code><code>int</code> <code>pageCount = pdfReader.NumberOfPages;</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>i = 1; i &lt;= pageCount; ++i)</code>

<code>            </code><code>{</code>

<code>                </code><code>page = pdfReader.GetPageN(i);</code>

<code>                </code><code>contentarray = page.GetAsArray(PdfName.CONTENTS);</code>

<code>                </code><code>if</code> <code>(contentarray != </code><code>null</code><code>)</code>

<code>                </code><code>{</code>

<code>                    </code><code>for</code> <code>(</code><code>int</code> <code>j = 0; j &lt; contentarray.Size; j++)</code>

<code>                    </code><code>{</code>

<code>                        </code><code>stream = (PRStream)contentarray.GetAsStream(j);                        </code>

<code>                        </code><code>content = System.Text.Encoding.ASCII.GetString(PdfReader.GetStreamBytes(stream));</code>

<code>                        </code><code>//if (content.IndexOf("/OC") &gt;= 0 &amp;&amp; content.IndexOf("I'm watermark") &gt;= 0)</code>

<code>                        </code><code>if</code> <code>(content.Length == 123 &amp;&amp; content.IndexOf(</code><code>"I'm watermark"</code><code>) &gt;= 0)</code>

<code>                        </code><code>{</code>

<code>                            </code><code>stream.Put(PdfName.LENGTH, </code><code>new</code> <code>PdfNumber(0));</code>

<code>                            </code><code>stream.SetData(</code><code>new</code> <code>byte</code><code>[0]);</code>

<code>                        </code><code>}</code>

<code>                    </code><code>}</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>            </code><code>pdfReader.RemoveUnusedObjects();</code>

<code>            </code><code>//寫到輸出檔案</code>

<code>            </code><code>using</code> <code>(FileStream outStream = </code><code>new</code> <code>FileStream(pathfile_out, FileMode.Create, FileAccess.Write, FileShare.None))</code>

<code>                </code><code>using</code> <code>(PdfStamper stamper = </code><code>new</code> <code>PdfStamper(pdfReader, outStream))</code>

<code>            </code><code>return</code> <code>true</code><code>;</code>

<code>        </code><code>}</code>

<code>         </code> 

<code>        </code><code>//去圖檔水印示例(walker)</code>

<code>        </code><code>static</code> <code>bool</code> <code>ProcOne4XObject(</code><code>string</code> <code>pathfile_in, </code><code>string</code> <code>pathfile_out)</code>

<code>            </code><code>string</code> <code>pdfTempFilename = pathfile_out;</code>

<code>            </code><code>FileStream outStream = </code><code>new</code> <code>FileStream(pdfTempFilename, FileMode.Create);</code>

<code>            </code><code>PdfStamper stp = </code><code>new</code> <code>PdfStamper(pdfReader, outStream);   </code><code>//關聯輸入和輸出</code>

<code>            </code><code>PdfDictionary page1 = pdfReader.GetPageN(1);</code>

<code>            </code><code>PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(page1.Get(PdfName.RESOURCES));</code>

<code>            </code><code>PdfDictionary xobjDict = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));</code>

<code>            </code><code>if</code> <code>(xobjDict != </code><code>null</code><code>)</code>

<code>                </code><code>foreach</code> <code>(PdfName name </code><code>in</code> <code>xobjDict.Keys)</code>

<code>                    </code><code>//Console.WriteLine("name:" + name.ToString());</code>

<code>                    </code><code>PdfObject obj = xobjDict.Get(name);</code>

<code>                    </code><code>if</code> <code>(obj.IsIndirect())</code>

<code>                        </code><code>PdfDictionary objDict = (PdfDictionary)PdfReader.GetPdfObject(obj);</code>

<code>                        </code><code>PdfName type = objDict.GetAsName(PdfName.SUBTYPE);</code>

<code>                        </code><code>//Console.WriteLine("type:" + type);</code>

<code>                        </code><code>if</code> <code>(PdfName.IMAGE.Equals(type) &amp;&amp; name.ToString().IndexOf(</code><code>"I1"</code><code>) &gt; 0)</code>

<code>                            </code><code>PdfReader.KillIndirect(obj);</code>

<code>            </code><code>stp.Close();</code>

<code>        </code> 

<code>        </code><code>/*通過提取内容建立新PDF來變相去水印(walker)</code>

<code>         </code><code>* 參考:http://www.sharejs.com/codes/csharp/8619</code>

<code>         </code><code>* http://www.4guysfromrolla.com/articles/030911-1.aspx</code>

<code>         </code><code>* https://gist.github.com/7shi/805326</code>

<code>        </code><code>*/</code>

<code>        </code><code>static</code> <code>void</code> <code>ProcOneByExtract(</code><code>string</code> <code>pathfile_in, </code><code>string</code> <code>pathfile_out)</code>

<code>            </code><code>Document outDocument = </code><code>new</code> <code>Document();</code>

<code>            </code><code>FileStream outStream = </code><code>new</code> <code>FileStream(pathfile_out, FileMode.Create);</code>

<code>            </code><code>PdfWriter pdfWriter = PdfWriter.GetInstance(outDocument, outStream);</code>

<code>            </code><code>outDocument.Open();</code>

<code>            </code> 

<code>            </code><code>int</code> <code>pageNum = pdfReader.NumberOfPages;</code>

<code>            </code><code>Console.WriteLine(</code><code>"pageNum:"</code> <code>+ pageNum);</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>i = 1; i &lt;= pageNum; i++)</code>

<code>                </code><code>PdfDictionary pg = pdfReader.GetPageN(i);</code>

<code>                </code><code>PdfDictionary res = PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES)) </code><code>as</code> <code>PdfDictionary;</code>

<code>                </code><code>PdfDictionary xobj = PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT)) </code><code>as</code> <code>PdfDictionary;</code>

<code>                </code><code>if</code> <code>(xobj == </code><code>null</code><code>)</code>

<code>                    </code><code>Console.WriteLine(</code><code>"xobj == null"</code><code>);</code>

<code>                    </code><code>continue</code><code>;</code>

<code>                </code><code>var</code> <code>keys = xobj.Keys;</code>

<code>                </code><code>if</code> <code>(keys.Count == 0)</code>

<code>                    </code><code>Console.WriteLine(</code><code>"keys.Count == 0"</code><code>);</code>

<code>                </code><code>PdfObject obj = xobj.Get(keys.ElementAt(0));</code>

<code>                </code><code>if</code> <code>(!obj.IsIndirect())</code>

<code>                    </code><code>Console.WriteLine(</code><code>"!obj.IsIndirect()"</code><code>);</code>

<code>                </code><code>PdfDictionary tg = PdfReader.GetPdfObject(obj) </code><code>as</code> <code>PdfDictionary;</code>

<code>                </code><code>PdfName type = PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE)) </code><code>as</code> <code>PdfName;</code>

<code>                </code><code>Console.WriteLine(</code><code>"type:"</code> <code>+ type);</code>

<code>                </code><code>if</code> <code>(!PdfName.IMAGE.Equals(type))</code>

<code>                </code><code>{                    </code>

<code>                </code><code>int</code> <code>XrefIndex = (obj </code><code>as</code> <code>PRIndirectReference).Number;</code>

<code>                </code><code>PRStream pdfStream = pdfReader.GetPdfObject(XrefIndex) </code><code>as</code> <code>PRStream;</code>

<code>                </code><code>byte</code><code>[] data = PdfReader.GetStreamBytesRaw(pdfStream);</code>

<code>                </code><code>Image img = Image.GetInstance(obj </code><code>as</code> <code>PRIndirectReference);</code>

<code>                </code><code>float</code> <code>pageWidth = pdfReader.GetPageSize(i).Width;</code>

<code>                </code><code>float</code> <code>pageHeight = pdfReader.GetPageSize(i).Height;</code>

<code>                </code><code>float</code> <code>imgWidth = img.Width;</code>

<code>                </code><code>float</code> <code>imgHeight = img.Height;</code>

<code>                </code><code>outDocument.SetPageSize(</code><code>new</code> <code>Rectangle(pageWidth, pageHeight));</code>

<code>                </code><code>outDocument.NewPage();</code>

<code>                </code><code>img.ScaleToFit(pageWidth, pageHeight);</code>

<code>                </code><code>img.SetAbsolutePosition(0, 0);</code>

<code>                </code><code>outDocument.Add(img);</code>

<code>            </code><code>outDocument.Close();</code>

<code>    </code><code>}</code>

<code>}</code>

本文轉自walker snapshot部落格51CTO部落格,原文連結http://blog.51cto.com/walkerqt/1408792如需轉載請自行聯系原作者

RQSLT

繼續閱讀