use*_*134 2 pdf itext itextsharp
我正在使用iTextSharp并尝试从PDF中提取透明图像.当我提取图像时,透明度变为纯黑色并丢失.我发现了多个图像提取示例,但所有这些示例似乎都有相同的问题.我正在使用的代码如下
另一个例子来自itextpdf.com/examples/iia.php?id=284.此示例包括顶部"结果"部分中的图像.如果单击Img7.png,您将在图像中看到黑色边框,但是在页面底部有一个指向原始图像info.png的链接,该链接显示了它应该看起来的透明度.这是我遇到的确切问题.任何帮助或想法将不胜感激
public void ExtractImage(string pdfFile)
{
const int pageNumber = 1; //Page number to extract the image from
PdfReader pdf = new PdfReader(pdfFile);
PdfDictionary pg = pdf.GetPageN(pageNumber);
PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
foreach (PdfName name in xobj.Keys)
{
PdfObject obj = xobj.Get(name);
if (obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
string width = tg.Get(PdfName.WIDTH).ToString();
string height = tg.Get(PdfName.HEIGHT).ToString();
ImageRenderInfo imgRI =
ImageRenderInfo.CreateForXObject(new Matrix(float.Parse(width), float.Parse(height)),
(PRIndirectReference)obj, tg);
var fileType= imgRI.GetImage().GetFileType();
RenderImage(imgRI, imgPath + +imgRI.GetRef().Number + "_" + imgRI.GetRef().Generation + "test." + fileType);
}
}
pdf.Close();
}
private void RenderImage(ImageRenderInfo renderInfo, string saveImageLocation)
{
PdfImageObject image = renderInfo.GetImage();
using (var dotnetImg = image.GetDrawingImage())
{
if (dotnetImg != null)
{
dotnetImg.Save(saveImageLocation);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请阅读PDF规范(ISO-32000-1).您假设,例如透明PNG,可以作为透明PNG存储在PDF中.这个假设是错误的.
PDF中不支持图像类型PNG.将透明PNG添加到PDF文档时,会将其转换为两个压缩位图.一个位图是您所指的图像:据称失去透明度的图像.另一个位图,你没有告诉我们任何关于的图像,但就是那个,是这个图像的掩码.检查Image XObject时,您会注意到它具有对此掩码的引用.这在我的书 10.3.2节中解释,标题为"掩盖图像".
您对PDF文档中存储了透明图像的指控是错误的.相反,你有两个不透明的图像,其中一个图像是另一个图像的掩模,以实现透明度.您无法将这些图像提取为单个透明图像.您需要提取两个不透明图像并将它们合并为一个透明图像.这超出了iText(夏普)的范围.
归档时间: |
|
查看次数: |
3243 次 |
最近记录: |