2016-08-09 9 views
0

PDF形式を維持しながらPowershellを使用してPDFからコンテンツを取り除くPowershellを使用してPDFからコンテンツを取り除く

マイタスク: ドキュメントがPDF形式でない場合、簡単な作業を実行しようとしています。使用可能なデータが大量に開始される前に不要なデータを持つPDFがたくさんある場合、これはドキュメント内の '%PDF'より前のものです。必要なデータをすべて取り出し、新しいファイルにエクスポートするスクリプトが必要でした。その部分は超簡単だった。

問題: エクスポートされたデータは、もはやPDFとして開かないことを除いて正しくフォーマットされているように見えます。私はメモ帳でそれを開くことができます+ +とそれは手動できれいだったし、動作するものと同じに見えます。 Powershellの変更されたPDFの生コードを調べると、 'lines'ははるかに短くなっているようです。

$Path = 'C:\FileLocation' 
$Output = '.\MyFile.pdf' 
$LineArr = @() 

$Target = Get-ChildItem -Path $Path -Filter *.pdf -Recurse -ErrorAction SilentlyContinue | Get-Content -Encoding default | Out-String -stream 


$Target.Where({ $_ -like '*%PDF*' }, 'SkipUntil') | ForEach-Object{ 
    If ($_.contains('%PDF')){ 
     $LineArr += "%" + $_.Split('%')[1] 
    } 
    else{ 
     $LineArr += $_ 
    } 
} 

$LineArr | Out-File -Encoding Default -FilePath $Output 

PDF形式では実際に行が使用されないため、問題が発生している可能性があります。データが最初に配列に入れられているときや、書き込まれているときにPDF形式が壊れている可能性があります。 PDFが変更されて保存されている間、PDFの書式を保持する方法はありますか?たぶん私は単純なものを見逃しています。

+0

"Powershellの変更されたPDFの生コードを調べると、 'lines'がはるかに短くなっているように見えます。*" - 何が欠けていますか? – TessellatingHeckler

+0

私が知る限り、空白です。エンコードが維持され、すべての文字が同じに見えます。私は変更された何かがあると確信しています。 – KVB

+0

PDFファイル構造には、ファイル開始からの相対的なバイナリオフセットへの参照があるため、正しく解析する必要があります(iTextSharpを使用)。(https://www.google.com/#q=itextsharp+pdf+read+write+ – wOxxOm

答えて

0

私はiTextSharpを見ていて、まずWinbatchという古い言語を試してみることにしました。 (吹き出そう!)私は仕事をするスクリーンスクレーパーをほとんど作ったが、そのルートを取っていることの恥が私を良くしてくれた。したがって、関数ライブラリは次のストップでした。

これはちょっと驚いたことですが、この時点ではエラーチェックやログ記録は行われません。後でファイル検索と一緒に追加されます。 PDFで必要とされるすべての不要な部分をクリアしながら、PDFで必要とされる正確な形式を維持します。

strPDFdoco = "C:\TestPDFs\Test.pdf" 
strPDFString = "%%PDF" 
strPDFendString = "%%%%END" 
If FileExist(strPDFdoco) 
     strPDFName = ItemExtract(-1, strPDFdoco, "\") 
     strFixedPDFFullPath = ("C:\TestPDF\Fixed\": strPDFName) 
     strCurrentPDFFileSize = FileSize(strPDFdoco) ; Get size of PDF file 

     hndOldPDFFile = BinaryAlloc(strCurrentPDFFileSize) ; Allocate memory for reading PDF file 
     BinaryRead(hndOldPDFFile, strPDFdoco) ; Read PDF file 
     strStartIndex = BinaryIndexEx(hndOldPDFFile, 0, strPDFString, @FWDSCAN, @FALSE) ; Find start point for copy 
     strEndIndex = BinaryEodGet(hndOldPDFFile) ; find eof 
     strCount = strEndIndex - strStartIndex 

     strWritePDF = BinaryWriteEx(hndOldPDFFile, strStartIndex, strFixedPDFFullPath, 0, strCount) 
     BinaryFree(hndOldPDFFile) 
    ENDIF 

私はこれがどのように機能するかを知ったので、PSでこれを行うためのツールを作ることはより効果的です。 PSのビットと16進数で自分自身を教育する良い基盤かもしれない、Get-HexDumpという野生のPS機能があります。これはWinbatchで動作するので、私はAutoItに相当するものがあると仮定し、ほとんどの基本言語で再現することができます。

あり、ヘッダの前からCRUDをクリアしようとしているそこに多くの人々のように見えるし、そのPDFのドコサの終了後に、うまくいけば、このことができます、私はこれをモーフィングどんなスクリプトでヒットする半分ミルを持っていますに。もし私がそのルートに再度行くことを決めたら、そして私が覚えていれば、私はPS版で更新するかもしれません。

関連する問題