2016-08-31 10 views
1

私は以下のコードを使用してPDFファイルにテキストを追加しています。しかし、以下のコードはスキャンされたPDFに対しては機能しません。あなたが何か考えているなら、私を助けてください。asp.netを使用してスキャンしたPDFにテキストを挿入する方法

string oldFile = "C:\\PDF\\Memo1.pdf"; 
string newFile = "C:\\PDF\\MemoNew1.pdf"; 
PdfReader reader = new PdfReader(oldFile); 
Rectangle size = reader.GetPageSizeWithRotation(1); 
Document document = new Document(size); 
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write); 
PdfWriter writer = PdfWriter.GetInstance(document, fs); 
document.Open(); 
PdfContentByte cb = writer.DirectContent; 
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
cb.SetColorFill(BaseColor.DARK_GRAY); 
cb.SetFontAndSize(bf, 8); 
cb.BeginText(); 
string text = "AAAAAAAAAAAAAA..."; 
cb.ShowTextAligned(1, text, 520, 640, 0); 
cb.EndText(); 
cb.BeginText(); 
text = "ZZZZZZZZZZZZZZZZZZZZZ..."; 
cb.ShowTextAligned(2, text, 100, 200, 0); 
cb.EndText(); 
PdfImportedPage page = writer.GetImportedPage(reader, 1); 
cb.AddTemplate(page, 0, 0); 
document.Close(); 
fs.Close(); 
writer.Close(); 
reader.Close(); 
+0

あなたは* * "動作しない" とはどういう意味ですか?それは尋ねられました...まずテキストを追加し、スキャンされたPDFのページでそれを覆います。そのようなPDFのページは、通常、ページを埋める不透明なイメージです。したがって、スキャンしたページで簡単にあなたの文章をカバーすることができます。 – mkl

+0

システムで生成されたPDFでテキストを追加できます。ドキュメントをスキャンしてPDFに変換すると、同じコードが動作しません。 – sona

+0

...と私はちょうど理由を説明した。 – mkl

答えて

1

OPのコードは、最初のページのキャンバスに

BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
cb.SetColorFill(BaseColor.DARK_GRAY); 
cb.SetFontAndSize(bf, 8); 
cb.BeginText(); 
string text = "AAAAAAAAAAAAAA..."; 
cb.ShowTextAligned(1, text, 520, 640, 0); 
cb.EndText(); 
cb.BeginText(); 
text = "ZZZZZZZZZZZZZZZZZZZZZ..."; 
cb.ShowTextAligned(2, text, 100, 200, 0); 
cb.EndText(); 

を書い追加し、その上に既存のページを産む:

PdfImportedPage page = writer.GetImportedPage(reader, 1); 
cb.AddTemplate(page, 0, 0); 

したがって、不透明でインポートされたページのすべての部分を内容は下に書かれているものをカバーしています。

テキストコマンドを使用して描画されたテキストを含むページの場合、実際のテキストのみが不透明で、その周囲の「白」は実際には透明です。そのようなページがOPの書面の上に置かれた場合、その書面のほとんどは見えるままです。

スキャンを含むページの場合、通常、「白」が実際には不透明な白で透明ではない1つの大きなページサイズのビットマップイメージがあります。そのようなページがOPの執筆の上に置かれれば、そのすべての執筆は隠されている。

  • 最も単純な1:最初のページを追加し、命令の順序を変更し、その後、書き込みを追加します。

    PdfImportedPage page = writer.GetImportedPage(reader, 1); 
    cb.AddTemplate(page, 0, 0); 
    BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
    cb.SetColorFill(BaseColor.DARK_GRAY); 
    cb.SetFontAndSize(bf, 8); 
    cb.BeginText(); 
    string text = "AAAAAAAAAAAAAA..."; 
    cb.ShowTextAligned(1, text, 520, 640, 0); 
    cb.EndText(); 
    cb.BeginText(); 
    text = "ZZZZZZZZZZZZZZZZZZZZZ..."; 
    cb.ShowTextAligned(2, text, 100, 200, 0); 
    cb.EndText(); 
    

  • は、これを回避するために、複数のオプションがあります

    あまり複雑ではない:最初にブレンドモードを設定するダークンまたはを掛けて、任意の順序で追加します。これはExtGStateを使用して行われます:

    PdfGState gs1 = new PdfGState(); 
    gs1.BlendMode = new PdfName("Darken"); 
    cb.SetGState(gs1); 
    ... 
    ... add content in any order ... 
    
+0

既存のPDFにコンテンツをスタンプするために 'PdfWriter'と' PdfImportedPage'を使ってそれを追加したいかもしれません。 OPは代わりに 'PdfStamper'を使うべきです。スキャンされた画像だけを含むPDFは問題ではありませんが、インタラクティブな機能を備えた他のPDFがあるかもしれません。もし@sonaの顧客がそれらのものを持っていれば、すべてのコードを捨てて新たに開始しなければなりません。 –

+0

@sonaは 'beginText()'/'endText()'シーケンスを使ってテキストを追加しています。テキストを追加する簡単な方法があります... –

+0

@BrunoLowagieあなたはもちろん正しいです。私は単に主な問題に集中したかっただけです。特に、OPが何が起こったのか全く分からないためです。さらに、 'PdfWriter'と' PdfImportedPage'を使うことは、*常に*間違っているだけではありません。確かに、当時のユースケースについて私たちが知っていることを考えれば、おそらく間違っているでしょう。 2番目のオプションはもっと簡単に実装できるようになりますが(例えば、ブレンドモードや回転など、古いコンテンツに影響を与えるコンテンツを簡単に挿入できる高度な機能が必要です、...) – mkl

関連する問題