[英]pdfbox, PDFRenderer.renderImage().getWidth() and PDImageXObject.getImage().getWidth() return numbers in different scale?
我使用 pdfbox 將 pdf 轉換為圖像,發現 PDFRenderer 和 PDImageXObject 返回的寬度似乎具有不同的比例。 如何獲得相同比例的寬度?
這就是我獲得頁面寬度的方式:
PDFRenderer pdRender = new PDFRenderer(pdDoc);
BufferedImage singlePage = pdRender.renderImage(pgIdx-1);
singlePage.getWidth(); // pageWidth = 623
這就是我如何獲得圖像塊的寬度:
PDImageXObject image = (PDImageXObject) o;
image.getImage(); // imageWidth = 484
“pageWidth”是圖像元數據中顯示的實際大小,但“imageWidth”大於實際大小。 實際比例如下圖所示(整頁 vs 紅框)。
確定頁面大小的方法
PDFRenderer pdRender = new PDFRenderer(pdDoc);
BufferedImage singlePage = pdRender.renderImage(pgIdx-1);
singlePage.getWidth(); // pageWidth = 623
正在使用一些默認設置將頁面渲染為位圖后確定頁面寬度(以像素為單位),特別是在某些未知分辨率下。
您確定圖像尺寸的方法
PDImageXObject image = (PDImageXObject) o;
image.getImage(); // imageWidth = 484
正在確定位圖資源的實際尺寸,而不考慮它在頁面上的使用方式(如果有的話)。
因此,這些數字完全無關。
如果要比較 PDF 頁面上的大小,自然選擇的單位將是 PDF 頁面的默認用戶空間單位。 默認情況下,它們等於1 / 72英寸。
您可以像這樣以用戶空間單位檢索PDPage page
的頁面大小:
PDRectangle cropBox = page.getCropBox();
float width = cropBox.getWidth();
float height = cropBox.getHeight();
PDF 頁面上位圖的尺寸有點困難,因為位圖要進行任意仿射變換,即繪制時的當前變換矩陣(CTM)。 因此,您必須確定該 CTM 值。 為此,您必須解析頁面內容直到繪制位圖的位置,然后您必須從當前轉換矩陣中讀取 CTM。
PDFBox 示例PrintImageLocations
演示了這一點,輸出“displayed size = XXX, YYY in user space units”就是你要找的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.