簡體   English   中英

itext更改書簽縮放級別以繼承現有pdf的縮放

[英]Itext change bookmarks zoom level to inherit zoom in existing pdf

使用iText5 PDF庫,我能夠讀取 PDF中存在的書簽 現在,我想使用iText更改現有PDF zoom level of bookmarkszoom level of bookmarks (繼承縮放)。 是否可以使用iText PDF庫?如何使用?

我已經附上了截圖。 在此處輸入圖片說明

這是我用來更改書簽縮放級別的代碼(按照@lowagie注釋):

public void changeList(List<HashMap<String, Object>> list) {
        for (HashMap<String, Object> entry : list) {
            for (String key : entry.keySet()) {
                System.out.println(key);

                if ("Kids".equals(key)) {
                    Object o = entry.get(key);
                    changeList((List<HashMap<String, Object>>) o);
                } else if ("Page".equals(key)) {
                    String dest = (String) entry.get(key);
                    entry.put("Page", dest.replaceAll("Fit", "XYZ 30 100 0"));
                }
            }
        }
    }

書簽樹結構: 在此處輸入圖片說明

請看一下我對以下問題的回答: 將繼承Zoom(action屬性)設置為pdf文件中的書簽

在該答案中,我使用SimpleBookmark對象閱讀了書簽。 這可能與您閱讀書簽的方式相同。 結果是代表輪廓樹的HashMap對象List 我使用遞歸方法查找所有"Page"條目。

這些頁面條目包含一個目標,例如FitFitHXYZ ,...。您需要將所有這些引用都更改為XYZ引用,並將縮放系數設置為0。縮放系數0等效於“繼承縮放” 。

在我的Set繼承PDF書簽書簽的回答中,我有以下代碼:

public void changeList(List<HashMap<String, Object>> list) {
    for (HashMap<String, Object> entry : list) {
        for (String key : entry.keySet()) {
            if ("Kids".equals(key)) {
                Object o = entry.get(key);
                changeList((List<HashMap<String, Object>>)o);
            }
            else if ("Page".equals(key)) {
                String dest = (String)entry.get(key);
                entry.put("Page", dest.replaceAll("Fit", "FitV 60"));
            }
        }
    }
}

顯然,您可以用全新的動作替換任何現有的“ Page”動作。 例如:

entry.put("Page", "XYZ 30 100 0");

現在,您將使用繼承的縮放因子跳轉到頁面上的坐標30 100。 如果要放大其他部分,例如與原始位置或多或少對應的位置,則需要檢查原始PDF中遵循FitR的坐標。 共有4個:左下x,左下y,右上x和右上y坐標。 您可以將字符串與原始目標位置解析為這些值,然后將其中兩個坐標重用為XYZ目標中的X和Y值。

與XYZ目標一起傳遞的XY坐標是左上角的坐標。 例如,如果您具有FitR -3 234 486 627 ,則可以放大坐標為llx = -3,lly = 234,urx = 486和ury = 627的矩形(ll表示左下; ur表示上-對)。 左上角是llx,ury或在您的情況下x = -3和y =627。簡而言之:在這種情況下,您需要“ XYZ -3 627 0”。

不幸的是,如果您必須使用iText,我無濟於事。 但是,如果您只想更改書簽的縮放級別,則還可以使用PDF Clown庫,我個人非常喜歡該庫(尤其是與iText相比在API設計方面)。

看看我編寫的這個小型Java應用程序,它確實可以滿足您的需求。 Wizard類為您提供有關如何更改縮放級別的概述。 基本上,您可以使用以下方法實現此目的:

private void modifyBookmarks(Bookmarks bookmarks) {
    for (Bookmark bm : bookmarks) {
        if (!bm.getBookmarks().isEmpty()) {
            modifyBookmarks(bm.getBookmarks());
        }

        if (bm.getTarget() instanceof GoToDestination<?>) {
            Destination dest = ((GoToDestination<?>) 
                    bm.getTarget()).getDestination();
            dest.setMode(ModeEnum.XYZ);
            dest.setZoom(0.0);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM