2016-08-31 1 views
1

Ich verwende unten Code, der Text in PDF-Datei hinzufügt. Aber unter Code funktioniert nicht für gescannte PDF. Bitte helfen Sie mir, wenn Sie eine Idee haben.Wie man Text in gescanntes PDF unter Verwendung asp.net einfügt

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

Was meinst du mit * "funktioniert nicht" *? Das wurde gefragt ... Zuerst fügst du etwas Text hinzu und deckst es dann mit einer Seite aus einem gescannten PDF ab, und Seiten solcher PDFs sind normalerweise ein seitenfüllendes undurchsichtiges Bild. So decken Sie einfach Ihr Schreiben mit der gescannten Seite ab ... – mkl

+0

Ich bin in der Lage, Text in jedem System erzeugten PDFs hinzuzufügen. Aber wenn ich ein Dokument scanne und es in ein PDF konvertiere, funktioniert der gleiche Code nicht. – sona

+0

... und ich habe gerade erklärt warum. – mkl

Antwort

1

Code The OP zunächst auf eine Seite Leinwand

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(); 

und eine vorhandene Seite über sie dann legt das Schreiben ergänzt:

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

So jeden Teil der importierten Seite, mit undurchsichtigen Inhalt umfasst, was darunter geschrieben wurde.

Im Falle einer Seite, die Text enthält, der mit Textbefehlen gezeichnet wurde, ist nur der eigentliche Text undurchsichtig, das "Weiß" um ihn herum ist tatsächlich transparent. Wenn eine solche Seite über das OP geschrieben wird, bleibt der Großteil dieser Schrift sichtbar.

Im Fall einer Seite mit einem Scan gibt es jedoch normalerweise ein großes, seitengroßes Bitmap-Bild, in dem das "Weiß" tatsächlich ein Deckweiß ist, nicht transparent. Wenn eine solche Seite über das OP geschrieben wird, ist das gesamte Schreiben verborgen.


Es gibt mehrere Möglichkeiten, dies zu umgehen:

  • Die einfachste: Ändern Sie die Reihenfolge der Befehle, zunächst die Seite hinzufügen, dann das Schreiben hinzu:

    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(); 
    
  • Nicht viel komplizierter: Zuerst setzen Sie den Mischmodus auf Darken oder Multiplizieren Sie, fügen Sie dann in beliebiger Reihenfolge hinzu. Dies geschieht mit Hilfe eines ExtGState:

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

Sie können hinzufügen, dass 'PdfWriter' und' PdfImportedPage' zum Stempeln von Inhalt auf einer vorhandenen PDF-Datei * nicht * verwendet wird. Das OP sollte stattdessen 'PdfStamper' verwenden. PDFs, die nichts als gescannte Bilder enthalten, sind kein Problem, aber möglicherweise gibt es andere PDFs mit interaktiven Funktionen. Wenn der Kunde von @sona einige davon hat, muss sona den ganzen Code wegwerfen und neu beginnen. –

+0

@sona verwendet 'beginText()'/'endText()' Sequenzen, um Text hinzuzufügen. Es gibt einfachere Möglichkeiten, Text hinzuzufügen ... –

+0

@BrunoLowagie Sie haben natürlich Recht. Ich wollte mich nur auf das Hauptproblem konzentrieren, insbesondere weil das OP überhaupt nicht zu verstehen schien, was passiert. Außerdem ist die Verwendung von 'PdfWriter' und' PdfImportedPage' nicht * immer * falsch, nur * häufiger als nicht *. Zugegeben, in Anbetracht dessen, was wir über den vorliegenden Anwendungsfall wissen, ist es höchstwahrscheinlich falsch hier. Es macht die zweite Option einfacher zu implementieren, obwohl ...;) (Das Gesagte, würde ich wirklich gerne eine erweiterte Funktion, die mir leicht Inhalte, die Einfluss auf den alten Inhalt, z. B. für Blend-Modi oder zu drehen haben, voranzustellen , ...) – mkl

Verwandte Themen