日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了如何從PDF文件中刪除圖像?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

您好,感謝您回答我的問題。這個問題困擾了我很長時間。

我已經搜索這個QS很長時間了,我在堆棧溢出和Google上讀了很多文章,但那些文章過時了或碎片化了,所以我不得不尋求幫助。
我希望有人能幫幫我。

public class TEST04 {
    public static void main(String[] args) throws IOException {
        System.out.println("Hi");
        //ori pdf file
        String oriPDFFile = IFileUtils.getDesktopPath().getAbsoluteFile() + "\1.pdf";
        //out pdf file
        String outPDFFile = IFileUtils.getDesktopPath().getAbsoluteFile() + "\2.pdf";
        strip(oriPDFFile, outPDFFile);
    }

    //parse
    public static void strip(String pdfFile, String pdfFileOut) throws IOException {
        //load ori pdf file
        PDDocument document = PDDocument.load(new File(pdfFile));
        //get All pages
        List<PDPage> pageList = IterUtil.toList(document.getDocumentCatalog().getPages());

        for (int i = 0; i < pageList.size(); i++) {
            PDPage page = pageList.get(i);
            COSDictionary newDictionary = new COSDictionary(page.getCOSObject());
            PDFStreamParser parser = new PDFStreamParser(page);
            List tokens = parser.getTokens();
            List newTokens = new ArrayList();

            for (int j = 0; j < tokens.size(); j++) {
                Object token = tokens.get(j);
                if (token instanceof Operator) {
                    Operator operator = (Operator) token;
                    if (operator.getName().equals("Do")) {
                        COSName cosName = (COSName) newTokens.remove(newTokens.size() - 1);
                        deleteObject(newDictionary, cosName);
                        continue;
                    }
                }
                newTokens.add(token);
            }
            PDStream newContents = new PDStream(document);
            try (OutputStream outputStream = newContents.createOutputStream()) {
                ContentStreamWriter writer = new ContentStreamWriter(outputStream);
                writer.writeTokens(newTokens);
            }
            page.setContents(newContents);

//            ContentStreamWriter writer = new ContentStreamWriter(newContents.createOutputStream());
//            writer.writeTokens( newTokens );
//            page.setContents(newContents);
            
            PDResources newResources = new PDResources(newDictionary);
            page.setResources(newResources);

        }
        document.save(pdfFileOut);
        document.close();
    }
    //delete
    public static boolean deleteObject(COSDictionary d, COSName name) {
        for(COSName key : d.keySet()) {
            if( name.equals(key) ) {
                d.removeItem(key);
                return true;
            }
            COSBase object = d.getDictionaryObject(key);
            if(object instanceof COSDictionary) {
                if( deleteObject((COSDictionary)object, name) ) {
                    return true;
                }
            }
        }
        return false;
    }
}

堆棧跟蹤:

推薦答案

在my other answer中,我重點介紹了如何修復問題中的代碼。在這里,我將重點介紹一種不同的任務方法。

在代碼中,您可以嘗試刪除位圖圖像,方法是檢查頁面內容流,在繪制XObject中找到do操作,然后刪除此指令和引用的XObject。

簡單地將資源中的所有圖像XObject替換為一個空的表單XObject會更容易一些。這就是這里使用的方法。

因為該方法非常容易實現,所以我對其進行了擴展,使其不僅可以遍歷頁面的直接資源,還可以迭代為嵌入的表單XObject和模式。

void replaceBitmapImagesResources(PDDocument document) throws IOException {
    PDFormXObject pdFormXObject = new PDFormXObject(document);
    pdFormXObject.setBBox(new PDRectangle(1, 1));
    for (PDPage pdPage : document.getPages()) {
        replaceBitmapImagesResources(pdPage.getResources(), pdFormXObject);
    }
}

void replaceBitmapImagesResources(PDResources resources, PDFormXObject formXObject) throws IOException {
    if (resources == null)
        return;

    for (COSName cosName : resources.getPatternNames()) {
        PDAbstractPattern pdAbstractPattern = resources.getPattern(cosName);
        if (pdAbstractPattern instanceof PDTilingPattern) {
            PDTilingPattern pdTilingPattern = (PDTilingPattern) pdAbstractPattern;
            replaceBitmapImagesResources(pdTilingPattern.getResources(), formXObject);
        }
    }

    List<COSName> xobjectsToReplace = new ArrayList<>();
    for (COSName cosName : resources.getXObjectNames()) {
        PDXObject pdxObject = resources.getXObject(cosName);
        if (pdxObject instanceof PDImageXObject) {
            xobjectsToReplace.add(cosName);
        } else if (pdxObject instanceof PDFormXObject) {
            PDFormXObject pdFormXObject = (PDFormXObject) pdxObject;
            replaceBitmapImagesResources(pdFormXObject.getResources(), formXObject);
        }
    }

    for (COSName cosName : xobjectsToReplace) {
        resources.put(cosName, formXObject);
    }
}

(RemoveImages幫助器方法)

若要將此方法應用于PDDocument,只需使用該文檔作為參數調用第一個replaceBitmapImagesResources。

注意:我試圖保持代碼簡單;對于生產使用,請記住限制此處的遞歸,以防止無休止的遞歸,因為在某些PDF中,XObject或模式直接或間接地調用自身。此外,您可能需要檢查頁面批注和模板頁面的資源。

這篇關于如何從PDF文件中刪除圖像?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:PDF 刪除 圖像 文件
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定