8

JBIG2でエンコードされた画像を含むPDFファイルを印刷するのに役立つライブラリをいくつか提案してください。PDFRendererPDFBox私を助けないでください。これらのライブラリは単純なPDFを印刷できますが、JBIG2画像を含むPDFは印刷できません。PDFRenderer(PDFRedndrerのバグトラッカーのバグの問題によると)それを修正しようとしますが、それでも一部のページ(特にバーコードが存在する場合)は印刷したくありません。

PSjavax.printアプレット内でAPIを使用します

ありがとう!

更新:ICEPdfも試しましたが、あまりにも動作したくありません。

JPedalsこれらのライブラリ(PDFRenderer、ICEPdf、PDFBox)はすべてjbig2デコーダーを使用しているという結論に達しました 。バグ(一部のページが印刷されなかった)は、このデコーダーライブラリに起因します。このデコーダーのオープンソースバージョン(PDFRenderer、ICEPdf、PDFBoxで使用されている)はサポートされなくなりましたがJPedal、プロジェクトの新しい商用ブランチがあり、バグは新しい商用リリースで修正され、9ドルかかると書かれています。 k。

何か案は?

UPDATE 2:昨日、JPedalの無料ライブラリを他のオープンソースjbig2-imageioライブラリに置き換えようとしました。しかし、それでも成功した結果が得られなかったので、彼らのプロジェクトのページ(google-codeのフォーラム-ここ)に新しいトピックを作成しました。助けていただければ幸いです。

Apache PDFBoxまた、バグトラッカーに関するいくつかの有益な議論を見つけました:ここここ

4

5 に答える 5

3

ymsのあなたのコメントを通過するように答えます。「しかし、画像を抽出し、(さらに重要なことに)PDFに戻すためにどのライブラリを使用できますか?」


これは1)抽出の簡単なデモンストレーションです。jbig2またはからすべての画像を言うことができますpdf
2)jbig2画像を他の形式に変換します。私の場合はjpeg
3)をpdf含む新しいを作成しjpegます。

ライブラリjbig2-imageioおよびitexを使用します。

以下の例では、必要に応じてリソースディレクトリのパスを変更してください。
このために、私は最後に添付するいくつかのリソースを調べなければなりませんでした。お役に立てれば。

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.parser.*;

import com.levigo.jbig2.JBIG2ImageReader;
import com.levigo.jbig2.JBIG2ImageReaderSpi;
import com.levigo.jbig2.JBIG2ReadParam;
import com.levigo.jbig2.io.DefaultInputStreamFactory;

import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;

public class JBig2Image {
    private String filepath;
    private int imageIndex;

    public JBig2Image() {
        this.filepath = "/home/blackadmin/Desktop/pdf/demo18.jbig2";
        this.imageIndex = 0;
        extractImgFromPdf();
        convertJBig2ToJpeg();
        createPDF();
    }

    private void extractImgFromPdf() {
        try {
            /////////// Extract all Images from pdf /////////////////////////

            PdfReader reader = new PdfReader("/home/blackadmin/Desktop/pdf/orig.pdf");
            PdfReaderContentParser parser = new PdfReaderContentParser(reader);
            MyImageRenderListener listener = new MyImageRenderListener("/home/blackadmin/Desktop/pdf/demo%s.%s");
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                parser.processContent(i, listener);
            }
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }

    private void convertJBig2ToJpeg() {
        InputStream inputStream = null;
        try {
            ///////// Read jbig2 image ////////////////////////////////////////
            inputStream = new FileInputStream(new File(filepath));
            DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
            ImageInputStream imageInputStream = disf.getInputStream(inputStream);
            JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
            imageReader.setInput(imageInputStream);
            JBIG2ReadParam param = imageReader.getDefaultReadParam();
            BufferedImage bufferedImage = imageReader.read(imageIndex, param);

            ////////// jbig2 to jpeg ///////////////////////////////////////////
            ImageIO.write(bufferedImage, "jpeg", new File("/home/blackadmin/Desktop/pdf/demo18.jpeg"));
        } catch (IOException ex) {
            System.out.println(ex);
        } finally {
            try {
                inputStream.close();
            } catch (IOException ex) {
                System.out.println(ex);
            }
        }
    }

    public void createPDF() {
        Document document = new Document();
        try {
            PdfWriter.getInstance(document,
                    new FileOutputStream("/home/blackadmin/Desktop/pdf/output.pdf"));
            document.open();
            PdfPTable table = new PdfPTable(1); //1 column.    
            Image image = Image.getInstance("/home/blackadmin/Desktop/pdf/demo18.jpeg");
            image.scaleToFit(800f, 600f);
            image.scaleAbsolute(800f, 600f);   // Give the size of image you want to print on pdf
            PdfPCell nestedImgCell = new PdfPCell(image);
            table.addCell(nestedImgCell);
            document.add(table);
            document.close();
            System.out.println(
                    "======== PDF Created Successfully =========");
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public static void main(String[] args) throws IOException {
        new JBig2Image();
    }
}



class MyImageRenderListener implements RenderListener {

    /**
     * The new document to which we've added a border rectangle.
     */
    protected String path = "";

    /**
     * Creates a RenderListener that will look for images.
     */
    public MyImageRenderListener(String path) {
        this.path = path;
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock()
     */
    public void beginTextBlock() {
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock()
     */
    public void endTextBlock() {
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(
     * com.itextpdf.text.pdf.parser.ImageRenderInfo)
     */
    public void renderImage(ImageRenderInfo renderInfo) {
        try {
            String filename;
            FileOutputStream os;
            PdfImageObject image = renderInfo.getImage();
            if (image == null) {
                return;
            }
            filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType());
            os = new FileOutputStream(filename);
            os.write(image.getImageAsBytes());
            os.flush();
            os.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#renderText(
     * com.itextpdf.text.pdf.parser.TextRenderInfo)
     */
    public void renderText(TextRenderInfo renderInfo) {
    }
}

参照:
1)jbig2からの抽出pdf画像の抽出)(MyImageRenderListener)。
2)変換jbig2JBIG2ImageReaderDemo

于 2012-08-30T18:12:50.550 に答える
1

BorisvlによるJPedalライブラリのフォークは次の場所にあります。

https://github.com/Borisvl/JBIG2-Image-Decoder#readme

これには速度の改善が含まれており、バグも修正されるはずです。

編集:バグは単純な範囲チェックに関連しています。基本的に、GetPixelがビットマップエクステント外のx、y値にアクセスしないようにする必要があります。

getPixelを呼び出す前に、次の条件が満たされていることを確認する必要があります

col>=0およびcol<bitmap.width行>=0およびrow<bitmap.height

これは、いくつかの小さな範囲チェックを含むDelphiコードです。Javaコードを自分でテストすることはできませんが、src / org / jpedal / jbig2 / image/JBIG2Bitmap.javaに変更を加える必要があります。

procedure TJBIG2Bitmap.combine(bitmap: TJBIG2Bitmap; x, y: Integer; combOp: Int64);
...
...
var
begin
  srcWidth := bitmap.width;
  srcHeight := bitmap.height;
  srcRow := 0;
  srcCol := 0;

  if (x < 0) then x := 0;
  if (y < 0) then y := 0;

  for row := y to Min(y + srcHeight - 1, Self.height - 1) do   // <<<<<<<<  HERE
  begin
    for col := x to x + srcWidth - 1 do
    begin
      srcPixel := bitmap.getPixel(srcCol, srcRow);

アンドリュー。

于 2012-09-07T10:40:40.900 に答える
1

AcrobatReader自体を使用するのはどうですか?それを機能させるのは少し泥だらけであり、私が推測する堅牢なソリューションではありません。しかし、おそらくそれをすべて完全に印刷します。そして自由であれ

このルートに関するいくつかの情報。

http://vineetreynolds.blogspot.nl/2005/12/silent-print-pdf-print-pdf.html http://www.codeproject.com/Questions/98586/Programmatically-print-PDF-documents http:// forums.adobe.com/message/2336723

于 2012-08-23T15:59:33.817 に答える
1

別の方法として、このサーバー側で実行してみることができます。

アプローチ1:
外部アプリケーションを使用してPDFファイルをラスターイメージに変換し、代わりにそれを印刷します。

アプローチ2:
JBIG2画像を再圧縮してPDFファイルを調整します。1-

ファイルからJBIG2として圧縮された画像を抽出します。

2-他のアルゴリズム(jpeg、pngなど)でそれらを再圧縮します。これを行うには、JNIを使​​用するか外部アプリケーションを呼び出すことでJavaの外部に移動する必要がある場合があります。たとえば、GPLのリンセンスがニーズに合っている場合は、jbig2decまたはImageMagicを試してみることができます。

3-再圧縮された画像をPDFに戻します。


このアプローチは、これらの画像の品質がいくらか低下することを意味しますが、少なくともファイルを印刷することはできます。

これはJavaでiTextを使用して行うことができます。本iTextinAction (サンプルコード付き)に画像のサイズ変更に関する章があります。画像を抽出し、サイズを変更して(再圧縮を含む)、元に戻すという考え方があります。これを出発点として使用できます。iTextはAGPLプロジェクトであるため、商用のクローズドソースアプリケーションで無料で使用することはできません。

Windowsベースのサーバーを使用していて、商用ツールを購入できる場合は、C#/VB.NetまたはC++を使用したAmyuniPDF Creatorを使用してこれを実現することもできます(この提案には通常の免責事項が適用されます)。タイプacObjectTypePictureのすべてのオブジェクトを調べ、属性CompressionをacJPegHighに設定する必要があります。このアプローチでは、外部JBIG2デコーダーは必要ありません(興味がある場合は、ここにサンプルコードを含めることができます)。

PDFファイルを印刷するためだけにアプレットを使用している場合は、開いたときに印刷ダイアログを表示するPDFファイルを生成してみることもできます。

于 2012-08-24T14:04:10.557 に答える
1

ImageMagickとして、画像を処理して多くの形式に変換するツールがあります。数年前に使用したので、jbig2形式がデフォルトで適切に処理されているかどうか、またはプラグインをインストールする必要があるかどうかはわかりません。JBIG2次のことを試して、検索しているようなJで始まるサポートされている形式のリストを作成できます。

$ convert -list format | grep -i J

gsツール、別名GhostScriptと組み合わせて、ツールを使用してpdfに変換することは非常に明白です。

実際には、画像のPNG / JPEGバージョンを表示し、独自のメタデータを含む元のJBIG2ファイルへのダウンロードリンクを提供することを妨げるものは何もありません。

于 2012-08-27T15:44:34.687 に答える