使用ITextSharp在PDF上绘图,而无需创建新的PDF
本文关键字:PDF 创建 ITextSharp 绘图 使用 | 更新日期: 2023-09-27 17:50:54
我尝试使用ITextSharp在现有PDF上绘制简单的形状(矩形,圆圈…),而无需创建新的PDF。我找到了一个谈论这个问题的帖子(itextsharp修改现有的pdf(没有新的源pdf)并添加水印),我想知道是否有人能告诉我更多关于它的信息。
我的目标是通过在上面添加一个圆圈来修改pdf,目前的解决方案涉及创建一个新的pdf (Itextsharp)。是否有可能在PDF上添加圆圈而不创建新圆圈?谢谢你。
j .
不能同时读和写文件。想想Word是怎么工作的:你不能打开一个Word文档然后直接在里面写东西。Word总是创建一个临时文件,将更改写入其中,然后用它替换原始文件,然后丢弃临时文件。
你也可以这样做:
- 用
PdfReader
读取原始文件, - 为
PdfStamper
创建一个临时文件,完成后, - 用临时文件替换原文件。
或:
- 读取原始文件到
byte[]
, - 用
byte[]
创建PdfReader
, - 使用
PdfStamper
的原始文件路径
第二个选项更危险,因为如果您在PdfStamper
中执行导致异常的操作,将丢失原始文件。
关于使用PdfStamper
添加内容,请查看免费电子书the Best ittext Questions on StackOverflow中题为"操纵现有pdf"的部分。你会发现这样的问题:
- 如何添加水印到PDF文件?
- 如何在现有的PDF中插入到另一个页面的超链接?
- ittext -如何在现有PDF上盖章图像并创建锚
- …
所有这些示例都通过创建一个PdfContentByte
实例来添加内容,如下所示:
PdfContentByte canvas = stamper.getOverContent(pagenumber);
这是这个canvas
你需要使用时,在页面上绘制一个圆圈与页码pagenumber
。当你这样做时,使用正确的坐标是很重要的。这里解释:如何使用iText定位文本相对于页面的位置?
更新:
Json在注释中发布了以下代码:
string oldFile = @"C:'Users'ae40394'Desktop'hello.pdf";
string newFile = @"C:'Users'ae40394'Desktop'NEW.pdf";
// creating a reader with the original PDF
PdfReader reader = new PdfReader(oldFile);
Rectangle rect = reader.GetPageSize(1);
FileStream fs = new FileStream(newFile,FileMode.Create);
using (PdfStamper stamper = new PdfStamper(reader, fs)) {
// modify the pdf content
PdfContentByte cb = stamper.GetOverContent(1);
cb.SetColorStroke(iTextSharp.text.BaseColor.GREEN);
cb.SetLineWidth(5f);
cb.Circle(rect.GetLeft() + 30, rect.GetBottom() + 30 ,20f);
cb.Stroke();
}
reader.Close();
File.Replace(@"C:'Users'ae40394'Desktop'NEW.pdf", @"C:'Users'ae40394'Desktop'hello.pdf", @"C:'Users'ae40394'Desktop'hello.pdf.bac");
我稍微调整了一下代码,因为:
- 不需要
Document
对象, -
using
关闭时,stamper
关闭, - 当
stamper
关闭时,FileStream
也关闭 - 圆的坐标是硬编码的。我使用页面大小来确保它们相对于坐标系统的原点,尽管为了确定,你可能还想检查是否有裁剪框。
你可以同时读和写一个文件。
下面是一个例子:
private void button4_Click(object sender, EventArgs e)
{
using (PdfReader pdfReader = new PdfReader(new FileStream(pdfInput, FileMode.Open, FileAccess.Read, FileShare.Read)))
{
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(pdfInput, FileMode.Open, FileAccess.Write, FileShare.None)))
{
PdfContentByte canvas = pdfStamper.GetUnderContent(1);
canvas.SetColorFill(BaseColor.YELLOW);
canvas.Rectangle(36, 786, 66, 16);
canvas.Fill();
}
}
// PDF Datei im Anschluss anzeigen/öffnen
System.Diagnostics.Process.Start(pdfInput);
}
string oldFile = @"C:'...6166-21.pdf";
string newFile = @"C:'...NEW.pdf";
// open the reader
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();
// the pdf content
PdfContentByte cb = writer.DirectContent;
cb.SetColorStroke(iTextSharp.text.BaseColor.GREEN);
cb.Circle(150f, 150f, 50f);
cb.Stroke();
// create the new page and add it to the pdf
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);
// close the streams and voilá the file should be changed :)
document.Close();
fs.Close();
writer.Close();
reader.Close();