使用 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();
}
}
}
我们希望以编程方式将图像批量转换为 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();
}
}
}