如何使用 asp.net 在扫描的 PDF 中插入文本
How to insert text in scanned PDF using asp.net
我正在使用以下代码在 PDF 文件中添加文本。但是下面的代码不适用于扫描的 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();
OP的代码首先添加写入页面canvas
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);
因此,具有不透明内容的导入页面的每个部分都覆盖了下面写的内容。
如果页面包含使用文本命令绘制的文本,只有实际文本是不透明的,其周围的 "white" 实际上是透明的。如果将这样的页面放在 OP 的文字上,大部分文字仍然可见。
但是,如果页面包含扫描件,通常会有一个页面大小的大位图图像,其中 "white" 实际上是不透明的白色,而不是透明的。如果这样的一页覆盖在 OP 的文字上,那么所有的文字都会被隐藏。
有多种选择可以解决这个问题:
最简单的:改变指令顺序,先添加页面,再添加写法:
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();
并不复杂:首先将混合模式设置为Darken或Multiply,然后按任意顺序添加。这是使用 ExtGState:
完成的
PdfGState gs1 = new PdfGState();
gs1.BlendMode = new PdfName("Darken");
cb.SetGState(gs1);
...
... add content in any order ...
我正在使用以下代码在 PDF 文件中添加文本。但是下面的代码不适用于扫描的 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();
OP的代码首先添加写入页面canvas
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);
因此,具有不透明内容的导入页面的每个部分都覆盖了下面写的内容。
如果页面包含使用文本命令绘制的文本,只有实际文本是不透明的,其周围的 "white" 实际上是透明的。如果将这样的页面放在 OP 的文字上,大部分文字仍然可见。
但是,如果页面包含扫描件,通常会有一个页面大小的大位图图像,其中 "white" 实际上是不透明的白色,而不是透明的。如果这样的一页覆盖在 OP 的文字上,那么所有的文字都会被隐藏。
有多种选择可以解决这个问题:
最简单的:改变指令顺序,先添加页面,再添加写法:
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();
并不复杂:首先将混合模式设置为Darken或Multiply,然后按任意顺序添加。这是使用 ExtGState:
完成的PdfGState gs1 = new PdfGState(); gs1.BlendMode = new PdfName("Darken"); cb.SetGState(gs1); ... ... add content in any order ...