我们希望以编程方式将图片批量转换为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有一个选项,任何人都知道这是做什么的吗?
答案 0 :(得分:4)
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()
方法,并且不会更改页面大小。您将仍然在第1页,尺寸为A4。
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();
}
}
}