【问题标题】:Insert an image into an existing pdf document using iText Sharp使用 iTextSharp 将图像插入现有的 pdf 文档
【发布时间】:2016-03-03 21:46:41
【问题描述】:

我需要将图像插入到特定位置的现有 pdf 中。我在this 问题上尝试了答案。但是无论我以何种不同的方式将图像插入到 (0,0) 位置(左下角)。我尝试了另一种方法,而不是使用流,而是使用 iTextSharp 中的 Document 类,如 here 所示。现在我可以将图像放置在所需的位置,但这种方法只是用这个图像创建一个新文档。我搜索的大多数文章都使用 PdfReader 和 PdfStamper,所以我认为这是推荐的方式。任何帮助表示赞赏。为我尝试的两种方法发布以下代码。

PdfStamper 方法

   private void AddImage(string filePath)
    {
        string imageURL = @"ImagePath\Image.jpg";

        using (Stream inputPdfStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        using (Stream inputImageStream = new FileStream(imageURL, FileMode.Open, FileAccess.Read))
        using (Stream outputPdfStream = new FileStream(@"ResultingPdfPath\Abcd.pdf", FileMode.Create, FileAccess.ReadWrite))
        {
            Image image = Image.GetInstance(inputImageStream);
            image.ScaleToFit(100, 100);

            var reader = new PdfReader(inputPdfStream);
            var stamper = new PdfStamper(reader, outputPdfStream);

            PdfContentByte content = stamper.GetUnderContent(1);
            image.SetAbsolutePosition(100f, 150f);
            content.AddImage(image);

            stamper.Close();

            reader.Close();
        }
    }

文档类方法

    private void TestMessage(string filePath)
    {
        string imageURL = @"ImagePath\Image.jpg";

        Document doc = new Document(PageSize.A4);

        PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(filePath, FileMode.Open));

        doc.Open();

        iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(imageURL);
        jpg.ScaleToFit(140f, 120f);
        jpg.SetAbsolutePosition(100, 100);
        jpg.SpacingBefore = 10f;
        jpg.SpacingAfter = 1f;
        jpg.Alignment = Element.ALIGN_LEFT;
        doc.Add(jpg);
        doc.Close();
    }

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 代码 sn -p "文档类方法" 错误:它创建了一个新文档。代码 sn -p "PdfStamper method" 是正确的。您在不同的位置添加图像两次,一次在现有内容的下方,一次在现有内容的顶部。您使用的是硬编码坐标,没有考虑原始 PDF 的页面大小(和裁剪框)。不过,我不相信您声称图像都添加到坐标(0, 0)。由于您没有说实话,因此无法回答您的问题。 PS:stamper.FormFlattening = true;这行无关紧要,应该去掉。
  • @BrunoLowagie 我在尝试不同的方法时进行了一些更改,但在粘贴之前忘记对其进行编辑。我编辑了这个问题。即使我尝试编辑后的代码,我也无法得到想要的结果。即使我没有考虑页面大小,图像位置也不应该根据我在 SetAbsolutePosition 中给出的值而改变吗?而且我不明白不相信我的说法?
  • 您没有告诉我们您的期望。期望的结果是什么?您是否期望图像以其他内容移动的方式插入?在这种情况下,请放弃:PDF 不允许您这样做。你没看图吗?也许它被一个不透明的形状所覆盖,或者它被添加到 页面的可见区域之外。我不相信的是,无论您在image.SetAbsolutePosition(100f, 150f); 行中添加什么而不是100f, 150f,图像总是添加到0, 0。这是不可能的,因此我不相信你说的话。
  • @BrunoLowagie 我希望将图像添加到我在 SetAbsolutePosition 中指定的位置。我什至尝试获取文档的大小并编写代码 image.SetAbsolutePosition(width - 100f, height - 150f) 但没有用。我可以看到图像,但无论我做什么,它总是在左下角。而且我不希望图像移动内容。我认为我的 GetUnderContent 代码会使图像上的内容重叠(如果需要),反之亦然。为什么你这么固执地让我试图隐瞒一些关于我的查询的事情?这样做我能得到什么?
  • 当人们说“它不起作用”没有提供证明(例如,以可以检查的 PDF 的形式)并且 没有提供 b> SSCCE,我假设他们不想要答案。还有其他解释吗?我还能假设什么?我无法重现您的问题。成千上万的开发人员通过定义绝对坐标成功地将图像添加到现有 PDF,但您声称“它不起作用”。你要我怎么回应?你让我觉得你并不真正需要帮助。如果你这样做了,你会提供更多信息。

标签: image itextsharp


【解决方案1】:

我调整了您的方法以接受可变输出路径和位置,并使用 iTextSharp 5.5.7 对其进行了测试,如下所示:

[TestFixture]
class TestInsertImage
{
    /// iText stamp image on top not always working
    /// http://stackoverflow.com/questions/33898280/itext-stamp-image-on-top-not-always-working
    /// 
    [Test]
    public void AddStampToTestPdf()
    {
        Directory.CreateDirectory(@"C:\Temp\test-results\content\");

        AddImage(@"d:\Issues\stackoverflow\iText stamp image on top not always working\Multipage.pdf", @"C:\Temp\test-results\content\Multipage-stamp-Image-100-150.pdf", 100f, 150f);
        AddImage(@"d:\Issues\stackoverflow\iText stamp image on top not always working\Multipage.pdf", @"C:\Temp\test-results\content\Multipage-stamp-Image-150-100.pdf", 150f, 100f);
    }

    private void AddImage(string filePath, string outPath, float x, float y)
    {
        string imageURL = @"c:\Repo\GitHub\testarea\itext5\src\test\resources\mkl\testarea\itext5\layer\Willi-1.jpg";

        using (Stream inputPdfStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        using (Stream inputImageStream = new FileStream(imageURL, FileMode.Open, FileAccess.Read))
        using (Stream outputPdfStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite))
        {
            Image image = Image.GetInstance(inputImageStream);
            image.ScaleToFit(100, 100);

            var reader = new PdfReader(inputPdfStream);
            var stamper = new PdfStamper(reader, outputPdfStream);

            PdfContentByte content = stamper.GetUnderContent(1);
            image.SetAbsolutePosition(x, y);
            content.AddImage(image);

            stamper.Close();

            reader.Close();
        }
    }
}

结果如下。

如您所见,定位信息明显得到尊重,图像绝对总是在左下角。

如果这对 OP 确实不起作用,他会保留我们帮助他所需的信息。

Multipage-stamp-Image-100-150.pdf

使用

创建
AddImage(@"d:\Issues\stackoverflow\iText stamp image on top not always working\Multipage.pdf", @"C:\Temp\test-results\content\Multipage-stamp-Image-100-150.pdf", 100f, 150f);

Multipage-stamp-Image-150-100.pdf

创建使用:

AddImage(@"d:\Issues\stackoverflow\iText stamp image on top not always working\Multipage.pdf", @"C:\Temp\test-results\content\Multipage-stamp-Image-150-100.pdf", 150f, 100f);

【讨论】:

  • 如果有人想知道 Damir Makhmudov 在他同时删除的答案中如何指定要插入图像的页数stamper.GetUnderContent(1) 中的 1 选择第 1 页的 UnderContent .
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多