- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我构建了一种方法,试图查看给定 pdf 中所有嵌入图像的分辨率是否至少为 300 PPI(适合打印)。它所做的是循环浏览页面上的每个图像,并将其宽度和高度与艺术框的宽度和高度进行比较。如果每页只有一张图片,它会成功运行,但当有多张图片时,艺术框大小会包含所有图片,从而导致数字丢失。
我希望有人可能知道如何获取绘制图像的矩形大小,以便我可以正确比较,或者是否有更简单的方法来获取图像对象的 PPI(因为它会是呈现在其矩形中,而不是原始形式)。
这是上述方法的代码
private static bool AreImages300PPI(PdfDictionary pg)
{
var res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
var xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
if (xobj == null) return true;
foreach (PdfName name in xobj.Keys)
{
PdfObject obj = xobj.Get(name);
if (!obj.IsIndirect()) continue;
var tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
var type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
var width = float.Parse(tg.Get(PdfName.WIDTH).ToString());
var height = float.Parse(tg.Get(PdfName.HEIGHT).ToString());
var artbox = (PdfArray) pg.Get(PdfName.ARTBOX);
var pdfRect = new PdfRectangle(float.Parse(artbox[0].ToString()), float.Parse(artbox[1].ToString()),
float.Parse(artbox[2].ToString()), float.Parse(artbox[3].ToString()));
if (PdfName.IMAGE.Equals(type) && (width < pdfRect.Width*300/72 || height < pdfRect.Height*300/72)
|| ((PdfName.FORM.Equals(type) || PdfName.GROUP.Equals(type)) && !AreImages300PPI(tg)))
{
return false;
}
}
return true;
}
作为引用,这里是调用它的方法:
internal static List<string> GetLowResWarnings(string MergedPDFPath)
{
var returnlist = new List<string>();
using (PdfReader pdf = new PdfReader(MergedPDFPath))
{
for (int pageNumber = 1; pageNumber <= pdf.NumberOfPages; pageNumber++)
{
var pg = pdf.GetPageN(pageNumber);
if (!AreImages300PPI(pg))
returnlist.Add(pageNumber.ToString());
}
}
return returnlist;
}
感谢您提供的任何帮助。
最佳答案
我可以给你一条完全不同的道路吗?您正在查看全局文件中的图像,但看不到它们在页面中的使用方式。
iTextSharp 有一个名为 iTextSharp.text.pdf.parser.PdfReaderContentParser
的类它可以运行 PdfReader
并告诉您有关它的事情。您可以通过实现 iTextSharp.text.pdf.parser.IRenderListener
来订阅信息界面。对于它遇到的每个图像,您的类的 RenderImage
方法将被调用 iTextSharp.text.pdf.parser.ImageRenderInfo
目的。从这个对象中,您可以获得实际图像以及当前变换矩阵,后者将告诉您图像是如何放置到文档中的。
使用此信息,您可以创建这样的类:
public class MyImageRenderListener : iTextSharp.text.pdf.parser.IRenderListener {
//For each page keep a list of various image info
public Dictionary<int, List<ImageScaleInfo>> Pages = new Dictionary<int, List<ImageScaleInfo>>();
//Need to manually change the page when using this
public int CurrentPage { get; set; }
//Pass through the current page units
public Single CurrentPageUnits { get; set; }
//Not used, just interface contracts
public void BeginTextBlock() { }
public void EndTextBlock() { }
public void RenderText(iTextSharp.text.pdf.parser.TextRenderInfo renderInfo) { }
//Called for each image
public void RenderImage(iTextSharp.text.pdf.parser.ImageRenderInfo renderInfo) {
//Get the basic image info
var img = renderInfo.GetImage().GetDrawingImage();
var imgWidth = img.Width;
var imgHeight = img.Height;
img.Dispose();
//Get the current transformation matrix
var ctm = renderInfo.GetImageCTM();
var ctmWidth = ctm[iTextSharp.text.pdf.parser.Matrix.I11];
var ctmHeight = ctm[iTextSharp.text.pdf.parser.Matrix.I22];
//Create new key for our page number if it doesn't exist already
if (!this.Pages.ContainsKey(CurrentPage)) {
this.Pages.Add(CurrentPage, new List<ImageScaleInfo>());
}
//Add our image info to this page
this.Pages[CurrentPage].Add(new ImageScaleInfo(imgWidth, imgHeight, ctmWidth, ctmHeight, this.CurrentPageUnits));
}
}
它使用这个辅助类来存储我们的信息:
public class ImageScaleInfo {
//The page's unit space, almost always 72
public Single PageUnits { get; set; }
//The image's actual dimensions
public System.Drawing.SizeF ImgSize { get; set; }
//How the image is placed into the page
public System.Drawing.SizeF CtmSize { get; set; }
//Automatically calculate how the image is scaled
public Single ImgWidthScale { get { return ImgSize.Width / CtmSize.Width; } }
public Single ImgHeightScale { get { return ImgSize.Height / CtmSize.Height; } }
//Helper constructor
public ImageScaleInfo(Single imgWidth, Single imgHeight, Single ctmWidth, Single ctmHeight, Single pageUnits) {
this.ImgSize = new System.Drawing.SizeF(imgWidth, imgHeight);
this.CtmSize = new System.Drawing.SizeF(ctmWidth, ctmHeight);
this.PageUnits = pageUnits;
}
}
那么使用它真的很简单:
//Create an instance of our helper class
var imgList = new MyImageRenderListener();
//Parse the PDF and inspect each image
using (var reader = new PdfReader(testFile)) {
var proc = new iTextSharp.text.pdf.parser.PdfReaderContentParser(reader);
for (var i = 1; i <= reader.NumberOfPages; i++) {
//Get the page object itself
var p = reader.GetPageN(i);
//Get the page units. Per spec, page units are expressed as multiples of 1/72 of an inch with a default of 72.
var pageUnits = (p.Contains(PdfName.USERUNIT) ? p.GetAsNumber(PdfName.USERUNIT).FloatValue : 72);
//Set the page number so we can find it later
imgList.CurrentPage = i;
imgList.CurrentPageUnits = pageUnits;
//Process the page
proc.ProcessContent(i, imgList);
}
}
//Dump out some information
foreach (var p in imgList.Pages) {
foreach (var i in p.Value) {
Console.WriteLine(String.Format("Image PPI is {0}x{1}", i.ImgWidthScale * i.PageUnits, i.ImgHeightScale * i.PageUnits));
}
}
编辑
根据@BrunoLowagie 下面的评论,我更新了上面的内容以删除“magic 72”并实际尝试查询文档以查看它是否已被覆盖。不太可能发生,但一两年后有人会发现一些晦涩难懂的 PDF 并提示这段代码不能正常工作所以安全总比抱歉好。
关于c# - 如何使用 ITextSharp 获取 PDF 中嵌入图像的分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23815950/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!