簡體   English   中英

PDF Box getXObjectNames() 無法識別我的 PDF 上的條形碼,但它可以識別我從互聯網上獲取的 PDF 文件中的條形碼

[英]PDF Box getXObjectNames() does not recognize bar code on my PDF, however it does recognize it on a PDF file I got off the internet

我正在嘗試使用getXObjectNames()從我的 PDF 中獲取和讀取條形碼。

如果你看到上面的 JIRA 項目,你會看到一個 PDF 文件附在它上面。 當我在該 PDF 文件上運行代碼時,我得到了所需的輸出(即打印了條形碼類型。)

但是,當我在 PDF 上運行它時,它無法識別其中的條形碼。 (我已經檢查過條形碼實際上是圖像而不是文本。)

此外,它聽起來不可思議,但它在我的PDF曾經做過的工作,從那時起,我還沒有做出任何改變,但它絕對不會現在的工作。 (由於某種原因,我無法共享 PDF。)

有沒有人遇到過類似的問題?

這也是我關於 Stack Overflow 的第一個問題。 如果我在任何地方錯了,請告訴我。

這是該 pdf 的鏈接: https : //drive.google.com/file/d/1PzVApIePg4U9XL399BpAd2oeY6Q2tLEB/view? usp =drivesdk

一般來說

由於您沒有顯示您的代碼,而只是將其描述為PDFBOX-2124 中的代碼非常相似,並且正如您所說,由於某種原因無法共享 PDF,因此我只有該代碼要分析。 因此,我無法說出真正的問題,而只是列舉了一些可能的問題

首先,該代碼僅檢查給定頁面的直接資源以獲取位圖圖像:

PDResources pdResources = pdPage.getResources();

Map<String, PDXObject> xobjects = (Map<String, PDXObject>) pdResources.getXObjects();
if (xobjects != null)
{
    for (String key : xobjects.keySet())
    {
        PDXObject xobject = xobjects.get(key);
        if (xobject instanceof PDImageXObject)
        {
            PDImageXObject imageObject = (PDImageXObject) xobject;
            String suffix = imageObject.getSuffix();
            if (suffix != null)
            {
                BufferedImage image = imageObject.getImage();
                extractBarcodeArrayByAreas(image, this.maximumBlankPixelDelimiterCount);
            }
        }
    }
}   

PDFBOX-2124 PdPageBarcodeScanner方法scsan

位圖圖像也可以存儲在其他地方,例如

  • 在頁面上使用的表單 xobjects、patterns 或 Type 3 字體的單獨資源中; 要找到它們,也必須檢查其他頁面資源,甚至遞歸地檢查,因為圖像可能是頁面上使用的表單 xobject 中使用的模式的資源;
  • 在頁面注釋的單獨資源中; 因此,我們也必須遞歸到注釋資源中;
  • 內聯在某些內容流中; 因此,還必須搜索頁面本身的內容流、頁面資源(遞歸)以及頁面注釋及其資源(遞歸)。

此外,位圖可能以 PDFBox 不知道如何導出為BufferedImage某種格式(特別是某些顏色空間)給出。

此外,可以使用應用於純黑色位圖的一些掩碼構建條形碼,在這種情況下,您的代碼可能只會嘗試掃描該純黑色圖像。

此外,你說

我已經檢查過條形碼實際上是圖像而不是文本。

如果只檢查條碼不是文本,那么它可能不僅是位圖圖像,還可以通過矢量圖形指令繪制。 因此,您還必須檢查所有內容流中是否有繪制條碼的矢量圖形指令。

也可能有組合,例如在繪制純黑色內聯位圖圖像等時,矢量圖形的軟掩碼可能處於活動狀態。

而且我確定我在這里錯過了許多選項。


作為下一步,您可能想要分析無法共享PDF,以了解該條碼的繪制方式。

或者,您可以將頁面呈現為位圖圖像並使用 zxing 在該大位圖中搜索條形碼。


Sample PDF.pdf

您提供了一個示例 PDF 的鏈接。 所以我嘗試使用PDFBOX-2124非常相似的代碼提取條形碼。 顯然,那里的代碼是用於某些 PDFBox 2.0.0-SNAPSHOT 的,因此必須對其進行一些更正。 特別是您在問題標題中提到的方法getXObjectNames()最后被使用:

PDResources pdResources = pdPage.getResources();
int index = 0;

for (COSName name : pdResources.getXObjectNames()) {
    PDXObject xobject = pdResources.getXObject(name);
    if (xobject instanceof PDImageXObject)
    {
        PDImageXObject imageObject = (PDImageXObject) xobject;
        String suffix = imageObject.getSuffix();
        if (suffix != null)
        {
            BufferedImage image = imageObject.getImage();

            File file = new File(RESULT_FOLDER, String.format("Sample PDF-1-%s.%s", index, imageObject.getSuffix()));
            ImageIO.write(image, imageObject.getSuffix(), file);
            index++;
            System.out.println(file);
        }
    }
}

ExtractImages測試testExtractSamplePDFJayshreeAtak

輸出:一張位圖圖像導出為“示例 PDF-1-0.tiff”,如下所示:

圖像為 png

因此,我無法重現您的問題

PDF Box getXObjectNames() 無法識別我的 PDF 上的條形碼,但它可以識別我從互聯網上獲取的 PDF 文件中的條形碼

顯然getXObjectNames()確實返回位圖圖像 xobject 資源的名稱,而 PDFBox 將其導出就好了。

請檢查您的代碼是否如所聲稱的那樣未提取圖像,或者后面的某個步驟是否根本無法處理它。

如果在您的情況下確實沒有提取圖像,

  • 更新您的 PDFBox 版本(我使用了當前的開發頭,但最新發布的版本應該返回相同的版本),
  • 更新您的 Java,
  • 檢查您是否有可能導致麻煩的額外 JAI jar。

如果在您的情況下,圖像被提取但未按預期被后續代碼分析,

  • 更徹底地調試以找出分析失敗的地方,
  • 在這里創建一個新問題,重點是二維碼圖像分析,
  • 並提供足夠的代碼和 tiff 文件以允許人們實際重現問題。

暫無
暫無

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

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