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

Converting images to PDF with iTextSharp preserve clipping path

我们希望以编程方式将图像批量转换为 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()
当您不向 Document 构造函数传递参数时,

A4 是默认大小。之后,您尝试像这样更改页面大小:

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();
         }
     }
}