iText 将 JPG 的字节直接复制到 PDF 中。没有一个字节被改变。如果您说您的 JPG 有剪切路径(我从未听说过这样的事情)并且您在 PDF 中没有看到该功能,那么您将面临 PDF 固有的限制,而不是 iText 的限制。 iText 甚至不查看 JPG 字节:它只是使用过滤器 DCTDecode 创建 PDF 流对象。
您必须应用剪切路径before将图像添加到 PDF。您可能知道,PDF 不支持 PNG,而 PNG 支持透明度。当 iText 遇到透明 PNG 时,它会处理该 PNG。它创建两个图像:一个不透明图像使用/FlateDecode
和一张单色图像使用/FlateDecode
。不透明图像与单色图像作为其蒙版相加以获得透明度。我想你必须以类似的方式预处理你的 JPG。
关于内嵌图像:
不要使用内联图像:使用内联图像意味着图像存储在 PDF 的内容流中,而不是存储为图像 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();
}
}
}