c# - 使用 iTextSharp 将图像转换为 PDF 保留剪切路径

标签 c# itext jpeg clipping

我们希望以编程方式将图像批量转换为 PDF。到目前为止,看起来我们将使用 iTextSharp,但我们遇到了带有剪切路径的 JPG 图像的问题。我们在测试中使用以下代码:

using (FileStream fs = new FileStream(output, FileMode.Create, FileAccess.Write, FileShare.None))
{
    using (Document doc = new Document())
    {
        using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
        {
            doc.Open();
            iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(source);

            image.SetAbsolutePosition(0, 0);
            doc.SetPageSize(new iTextSharp.text.Rectangle(0, 0, image.Width, image.Height, 0));
            doc.NewPage();

            writer.DirectContent.AddImage(image,false); 

            doc.Close();
        }
    }
}

JPG 图像中的剪切路径似乎只是被丢弃了。有没有办法保留剪切路径?此外,在调用 AddImage 时,有一个用于 InlineImage 的选项,有人知道这是做什么的吗?

最佳答案

iText 将 JPG 的字节直接复制到 PDF 中。没有一个字节被改变。如果您说您的 JPG 有剪切路径(我从未听说过这样的事情)并且您没有在 PDF 中看到该功能,那么您将面临 PDF 而非 iText 固有的限制。 iText 甚至不查看 JPG 字节:它只是使用过滤器 DCTDecode 创建一个 PDF 流对象。

在将图像添加到 PDF 之前,您必须应用剪切路径。您可能知道,PDF 不支持 PNG,而 PNG 支持透明度。当 iText 遇到透明 PNG 时,它会处理 PNG。它创建两幅图像:一幅使用 /FlateDecode 的不透明图像和一幅使用 /FlateDecode 的单色图像。不透明图像添加单色图像作为其掩码以获得透明度。我想您必须以类似的方式预处理您的 JPG。

关于内联图像:

不要使用内联图像:使用内联图像意味着图像存储在 PDF 的内容流中,而不是存储为 Image XObject(这是在 PDF 中存储图像的最佳方式)。内联图像只能用于大小为 4 KB 或更小的图像。 PDF 2.0 将禁止使用较大的内联图像。

补充说明:

我想我在您的代码中发现了一个问题。您正在创建页面大小为 A4 的文档:

Document doc = new Document()

A4 是您不向 Document 构造函数传递参数时的默认大小。之后,您尝试像这样更改页面大小:

doc.SetPageSize(new iTextSharp.text.Rectangle(0, 0, image.Width, image.Height, 0));
doc.NewPage();

但是:由于您还没有向第一页添加任何内容,NewPage() 方法将被忽略,页面大小也不会改变。您仍将位于 A4 尺寸的第 1 页。

iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(source);
using (FileStream fs = new FileStream(output, FileMode.Create, FileAccess.Write, FileShare.None))
{
    using (Document doc = new Document(image))
    {
        using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
        {
            doc.Open();
            image.SetAbsolutePosition(0, 0);
            writer.DirectContent.AddImage(image); 
            doc.Close();
         }
     }
}

关于c# - 使用 iTextSharp 将图像转换为 PDF 保留剪切路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30523645/

相关文章:

java - PDF 缩放/导入已修剪/裁剪的页面

python - 在 OpenCV (Python) 中,为什么我从灰度图像中获得 3 channel 图像?

java - 有趣的。 JAVA 中创建和读取 RGB 值是不同的

c#强制循环检查条件

c# - Azure 应用服务中的 System.BadImageFormatException : Bad binary signature.

c# - 使用 itextsharp 创建的 pdf 中的错误尺寸图像

c++ - 如何在cpp中将jpg图像转换为pgm格式

c# - 使用动态对象时出现 RuntimeBinderException

c# - 在 c# 中创建一个用户定义的表类型以在 sql server 存储过程中使用

c# - 在 c# 中使用 iTextSharp 在 pdf 中使用阿拉伯语