使用ITextSharp在PDF上绘图,而无需创建新的PDF

本文关键字:PDF 创建 ITextSharp 绘图 使用 | 更新日期: 2023-09-27 17:50:54

我尝试使用ITextSharp在现有PDF上绘制简单的形状(矩形,圆圈…),而无需创建新的PDF。我找到了一个谈论这个问题的帖子(itextsharp修改现有的pdf(没有新的源pdf)并添加水印),我想知道是否有人能告诉我更多关于它的信息。

我的目标是通过在上面添加一个圆圈来修改pdf,目前的解决方案涉及创建一个新的pdf (Itextsharp)。是否有可能在PDF上添加圆圈而不创建新圆圈?谢谢你。

j .

使用ITextSharp在PDF上绘图,而无需创建新的PDF

不能同时读和写文件。想想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();