2016-08-31 30 views
1

これは間違ったOCRのケースです。私は、PDFから隠されたテキストを削除する必要があり、私はそれを行う方法を考え出すのが苦労している。iTextSharpでPDF内のオブジェクトを削除して保存します

隠されたテキストは、/ QuickPDFsomethingという名前の領域にあり、/ XObject辞書はページの/ Resourcesディクショナリにあります。

iRups CS Viewer

私はこれら二つのことを試してみましたし、どちらも私は明らかに間違って何かをやっている仕事をしていません。

オプション1- Kill obj - PDFはAcrobatで開かれず、「このページにはエラーがあります。 Acrobatではページが正しく表示されないことがありますが、正常に表示されます。 'Critical parser failure:XObject resource missing'というピットストップが発生します。

PdfReader.KillIndirect(obj); 
oPdfFile.GetPdfReader().RemoveUnusedObjects(); 
var stamper = new PdfStamper(oPdfFile.GetPdfReader(), new FileStream(@"C:\temp.pdf", FileMode.Create)); 
stamper.Close(); 

オプション2 - CleanupProcessorは、 - A「グラフィックスオブジェクトは、インデックス付きピクセルフォーマットを有する画像から作成できません」に関する例外をスロー。

var stamper = new PdfStamper(oPdfFile.GetPdfReader(), new FileStream(@"C:\temp.pdf", FileMode.Create)); 
var cleanupLocations = new List<PdfCleanUpLocation>(); 
var pageRect = oPdfFile.GetPdfReader().GetCropBox(1); 
cleanupLocations.Add(new PdfCleanUpLocation(1, pageRect)); 
PdfCleanUpProcessor cleaner = new PdfCleanUpProcessor(cleanupLocations, stamper); 
cleaner.CleanUp(); 
stamper.Close(); 

I(この画像で41 0 R)/ QuickPDFオブジェクトを削除ならびに/ QuickPDF Doを用いてそれを呼び出すコンテンツストリームからそれを削除したいです

残念ながら私はPDFを提供できません。

これを行う方法に関するヒントを教えてください。

答えて

0

私自身の質問には答えたくありませんが、他の人が必要とする場合に備えて私が見つけた解決策を共有したいと思いました。

上記のオプション1が実際にオブジェクトを削除し、コンテンツストリームが/ QuickPDF XObjectへの参照を持っていたために、私がPitStopから取得した例外があったことがわかった。

ここで@ mklの解決策を試しましたが、Removing Watermark from PDF iTextSharpですが、PDFを回転させたコンテンツストリームに不要なデータを置いていました。

だから私はここで@ Chrisの解決策を見つけたRemoving Watermark from a PDF using iTextSharpと私はこのソリューションがどれくらい安定しているかわからないが動作するようだ。

これは、コンテンツ・ストリームから/ QuickPDFを除去するための私のソリューションです:

int numPages = oPdfFile.GetPdfReader().NumberOfPages; 
int pgNumber = 1; 

PdfDictionary page = oPdfFile.GetPdfReader().GetPageN(pgNumber); 
PdfArray contentarray = page.GetAsArray(PdfName.CONTENTS); 
PRStream stream; 
string content; 
if (contentarray != null) 
{ 
    //Loop through content 
    for (int j = 0; j < contentarray.Size; j++) 
    { 
     stream = (PRStream)contentarray.GetAsStream(j); 
     content = Encoding.ASCII.GetString(PdfReader.GetStreamBytes(stream)); 
     string[] tokens = content.Split('\n'); 
     for (int i = 0; i< tokens.Length; i++) 
     { 
      if (tokens[i].Contains("/QuickPDF")) 
      { 
       tokens[i] = string.Empty; 
      } 
     } 

     string outstr = string.Join("\n", tokens.Select(p => p).ToArray()); 
     byte[] outbytes = Encoding.ASCII.GetBytes(outstr); 
     stream.SetData(outbytes); 
    } 
} 
+0

これは別の方法です。 http://stackoverflow.com/a/39353196/943231 – Darren

関連する問題