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

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

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

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

問題描述

您好,感謝您回答我的問題。這個(gè)問題困擾了我很長(zhǎng)時(shí)間。

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

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中,我重點(diǎn)介紹了如何修復(fù)問題中的代碼。在這里,我將重點(diǎn)介紹一種不同的任務(wù)方法。

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

簡(jiǎn)單地將資源中的所有圖像XObject替換為一個(gè)空的表單XObject會(huì)更容易一些。這就是這里使用的方法。

因?yàn)樵摲椒ǚ浅H菀讓?shí)現(xiàn),所以我對(duì)其進(jìn)行了擴(kuò)展,使其不僅可以遍歷頁(yè)面的直接資源,還可以迭代為嵌入的表單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幫助器方法)

若要將此方法應(yīng)用于PDDocument,只需使用該文檔作為參數(shù)調(diào)用第一個(gè)replaceBitmapImagesResources。

注意:我試圖保持代碼簡(jiǎn)單;對(duì)于生產(chǎn)使用,請(qǐng)記住限制此處的遞歸,以防止無休止的遞歸,因?yàn)樵谀承㏄DF中,XObject或模式直接或間接地調(diào)用自身。此外,您可能需要檢查頁(yè)面批注和模板頁(yè)面的資源。

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

分享到:
標(biāo)簽:PDF 刪除 圖像 文件
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定