【问题标题】:How can I add an image to all pages of my PDF?如何将图像添加到我的 PDF 的所有页面?
【发布时间】:2014-03-21 10:42:08
【问题描述】:

我一直在尝试使用 itextsharp 将图像添加到所有页面。图像需要覆盖每一页的所有内容。我在所有其他doc.add()下方使用了以下代码

Document doc = new Document(iTextSharp.text.PageSize.A4, 10, 10, 30, 1);
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(Server.MapPath("~/pdf/" + fname), FileMode.Create));
doc.Open();
Image image = Image.GetInstance(Server.MapPath("~/images/draft.png"));
image.SetAbsolutePosition(12, 300);
writer.DirectContent.AddImage(image, false);
doc.Close();

上面的代码只在最后一页插入了一张图片。有没有办法在所有页面中以相同的方式插入图像?

【问题讨论】:

    标签: image pdf image-processing razor itextsharp


    【解决方案1】:

    图片只添加一次是正常的;毕竟:你只添加一次。 (或者您在代码 sn-p 中遗漏了一些基本步骤:请参阅我所做的编辑。)

    无论如何:您可以通过使用页面事件来解决您的问题。这里有一些Java的例子:http://itextpdf.com/sandbox/events

    或者你可以参考我的书的第 5 章。所有示例均在JavaC# 中提供。

    您应该分 5 步创建一个文档,并在第 2 步中添加一个事件:

    // step 1
    Document document = new Document();
    // step 2
    PdfWriter writer = PdfWriter.GetInstance(document, stream);
    MyEvent event = new MyEvent();
    writer.PageEvent = event;
    // step 3
    document.Open();
    // step 4
    // Add whatever content you want to add
    // step 5
    document.Close();
    

    你必须自己编写MyEvent类:

    protected class MyEvent : PdfPageEventHelper {
    
        Image image;
    
        public override void OnOpenDocument(PdfWriter writer, Document document) {
            image = Image.GetInstance(Server.MapPath("~/images/draft.png"));
            image.SetAbsolutePosition(12, 300);
        }
    
        public override void OnEndPage(PdfWriter writer, Document document) {
            writer.DirectContent.AddImage(image);
        }
    }
    

    MyEvent 类中的 OnEndPage() 将在 PdfWriter 完成一页时触发。因此,图像将添加到每个页面上。

    警告:OnEndPage() 方法之外创建 image 对象很重要,否则图像字节可能会被添加与 PDF 中的页面一样多的次数(导致臃肿的 PDF)。

    【讨论】:

    • 是的,我没有添加任何代码来添加图像,因为我从未找到任何方法。
    • 我正在使用剃须刀,但找不到创建文件或覆盖方法或包含外部 c# 文件的选项
    • Razor 使用的是过时的、不受支持的 iTextSharp 版本。它没有得到 iText 软件的认可。很抱歉,iText 没有人可以帮助您。您应该联系 Razor 的负责人。
    • 谢谢。我已经添加了剃刀标签。我正在检查是否有任何方法可以包含 .cs 文件中的类
    • 谢谢你,我找到了剃须刀的出路。我不确定您所说的是“过时且不受支持的版本”,但我只需要找到一种将 .cs 文件链接到剃须刀的方法。基本上你需要将.cs文件保存在根目录下一个名为“App_Code”的文件夹中
    【解决方案2】:
    Document document = new Document();
    // step 2
    
    PdfWriter writer = PdfWriter.GetInstance(document, stream);
    
     final MyEvent event = new MyEvent();
    
        writer.setPageEvent(event);
    
        document.Open();
    
    // Add whatever content you want to add
    
       document.Close();
    
    //Now Create The new class and override the onEndPage()
    //I have used this for footer image but you can add wherever you want 
    //in the whole page using setAbsolutePosition(see below the class)
    //I am using palyFramework with java
     package controllers;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.Image;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.pdf.ColumnText;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfPageEventHelper;
    import com.itextpdf.text.pdf.PdfWriter;
    import play.Play;
    
    public class MyEvent extends PdfPageEventHelper{
    
    @Override
    public void onEndPage(final PdfWriter writer, final Document document) 
    {
        final Font ffont = new Font(Font.FontFamily.TIMES_ROMAN,8, 
    Font.ITALIC);
        Image img;
        try {
            final Phrase footer = new Phrase("Powered By :", ffont);
    img=Image.getInstance(Files.readAllBytes(Play.application().getFile("/
                                         img- path/Image.png").toPath()));
            img.scaleToFit(60f, 40f);
               img.setAbsolutePosition(510,5);
            final PdfContentByte cb = writer.getDirectContent();
            cb.addImage(img);
            ColumnText.showTextAligned(cb, Element.ALIGN_CENTER,
                    footer,490, 15, 0);
        } catch (IOException | DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }}
    

    对我来说很好用;参考this link

    【讨论】:

    • 除了布鲁诺的回答之外,您的回答究竟提供了什么?
    • 是的,@mkl 我添加了 columnText bcoz 添加唯一的图像对我不起作用。我参考了这个链接并添加了developers.itextpdf.com/examples/page-events/…
    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多