PDF-Anzeigeproblem Tool Multivalent

Status
Nicht offen für weitere Antworten.

Faebz

Mitglied
Hallo Leute,

vielleicht gehört dies eher in das Multivalent- Supportforum, aber da dieses Forum viel besser besucht ist, versuch ich hier mal mein Glück und hoffe, dass ihr mir vielliecht irgendwie helfen könnt.

Mein Problem ist folgendes....

Ich benutze zum Anzeigen in meinem Applet die Multivalent PDF-Komponente....

Bei einem bestimmten PDF treten jetzt folgende Probleme auf....

Massive Perfomance-probleme: ca. 5 Minuten zum Laden
Auf dem Dokument befinden sich Barcodes und diverse andere transformierte (skaliert, gedrehte) Images.... welche auch die Performanceprobleme verursachen.

Zudem werden die rotiert, gedrehten Images, der Barcode und ein paar Logos, völlig verzerrt dargestellt.

Leider kann ich das PDF wegen Datenschutz nicht posten.

Ich habe festgestellt, dass das ewige Laden scheins nur bei Images vorkommt, für die ich den Filter "DCTDecode" zurück bekomm. Hat wohl irgendwas mit der der JPEG-Komprimierung von Acrobat zu tun.



Die Methode, die eigentlich die ganze Zeit beansprucht ist folgende:

bufferedimage = affinetransformop.filter(bufferedimage, null);

Also, grob sieht das insgesamt in diesem Fall dann folgendermaßen aus:

Code:
if ("DCTDecode".equals(string))
	bufferedimage = createJPEG(dict, inputstream, pdfreader); // ist ne Methode aus dem Multivalenttool, habe ich // unten noch hinzugefügt.

bufferedimage = affinetransformop.filter(bufferedimage, null); // benötigt 30s

Komischerweise funktioniert das Ganze, wenn ich mit Acrobat Professional eine PDF-Optimierung durchführe und folgende Angagen mache.

Umter Erweitert/PDF-Optimize...

deaktivier ich alle Optimierungen außer unter Bilder wähl ich bei Graustufenbilder das Kompressionsformat JPEG und unter Farbbilder wähl ich "bikubische Neuberechnung" 150 Zoll/Pixel bei bildern mit mehr als 250 Pixel/Zoll

und siehe da, das PDF wird danach in meiner Java-applikation innerhalb einer Sekunden völlig korrekt angezeigt.

Keine Ahnung, ob ihr mir mittels diesen Informationen irgendwie helfen könnt. Ich müsste es halt irgendwie schaffen, genau das gleiche, wie der Acrobat in meiner Java-anwendung machen, aber ich hab halt keine Ahnung....

Vielleicht hat ja jemand Lust von euch mitzugrübeln. Wär sehr dankbar... komm einfach nicht wirklich weiter an dem Problem....

Viele Grüße, Fabian




Leider halt nur decompilierter Code
Code:
static BufferedImage createJPEG(Dict dict, InputStream inputstream,
			PDFReader pdfreader) throws IOException {
		if (!$assertionsDisabled && (dict == null || inputstream == null))
			throw new AssertionError();
		ColorSpace colorspace = pdfreader.getColorSpace(dict.get("ColorSpace"),
				null, null);
		int i = 4;
		int i_14_ = colorspace.getNumComponents();
		if (i_14_ == 4) {
			Object object = dict.get("Length");
			byte[] is = InputStreams.toByteArray(inputstream,
					(object != null ? (long) pdfreader.getObjInt(object)
							: 10240L));
			i = JPEG.getTransform(is);
			inputstream = new ByteArrayInputStream(is);
		}
		ImageReader imagereader = (ImageReader) ImageIO
				.getImageReadersByFormatName("JPEG").next();
		ImageIO.setUseCache(false);
		ImageInputStream imageinputstream = ImageIO
				.createImageInputStream(inputstream);
		imagereader.setInput(imageinputstream, true);
		BufferedImage bufferedimage;
		try {
			if (i_14_ == 4 || colorspace instanceof ColorSpaceLab) {
				ImageReadParam imagereadparam = imagereader
						.getDefaultReadParam();
				colorspace = (12 == i ? (ColorSpace) ColorSpaceCMYK
						.getInstance() : 13 == i ? (ColorSpace) ColorSpaceYCCK
						.getInstance() : colorspace);
				Raster raster = imagereader.readRaster(0, imagereadparam);
				raster = Rasters.toRGB(raster, colorspace);
				ComponentColorModel componentcolormodel = new ComponentColorModel(
						ColorSpace.getInstance(1000), false, true, 1, 0);
				bufferedimage = new BufferedImage(componentcolormodel,
						(WritableRaster) raster, true, null);
			} else
				bufferedimage = imagereader.read(0, null);
		} catch (IOException ioexception) {
			bufferedimage = null;
			System.err.println("Couldn't read JPEG: " + ioexception);
		}
		imagereader.dispose();
		imageinputstream.close();
		return bufferedimage;
	}
 
G

Guest

Gast
Faebz hat gesagt.:
Hallo Leute,

vielleicht gehört dies eher in das Multivalent- Supportforum, aber da dieses Forum viel besser besucht ist, versuch ich hier mal mein Glück und hoffe, dass ihr mir vielliecht irgendwie helfen könnt.

Mein Problem ist folgendes....

Ich benutze zum Anzeigen in meinem Applet die Multivalent PDF-Komponente....

Bei einem bestimmten PDF treten jetzt folgende Probleme auf....

Massive Perfomance-probleme: ca. 5 Minuten zum Laden
Auf dem Dokument befinden sich Barcodes und diverse andere transformierte (skaliert, gedrehte) Images.... welche auch die Performanceprobleme verursachen.

Zudem werden die rotiert, gedrehten Images, der Barcode und ein paar Logos, völlig verzerrt dargestellt.

Leider kann ich das PDF wegen Datenschutz nicht posten.

Ich habe festgestellt, dass das ewige Laden scheins nur bei Images vorkommt, für die ich den Filter "DCTDecode" zurück bekomm. Hat wohl irgendwas mit der der JPEG-Komprimierung von Acrobat zu tun.



Die Methode, die eigentlich die ganze Zeit beansprucht ist folgende:

bufferedimage = affinetransformop.filter(bufferedimage, null);

Also, grob sieht das insgesamt in diesem Fall dann folgendermaßen aus:

Code:
if ("DCTDecode".equals(string))
	bufferedimage = createJPEG(dict, inputstream, pdfreader); // ist ne Methode aus dem Multivalenttool, habe ich // unten noch hinzugefügt.

bufferedimage = affinetransformop.filter(bufferedimage, null); // benötigt 30s

Komischerweise funktioniert das Ganze, wenn ich mit Acrobat Professional eine PDF-Optimierung durchführe und folgende Angagen mache.

Umter Erweitert/PDF-Optimize...

deaktivier ich alle Optimierungen außer unter Bilder wähl ich bei Graustufenbilder das Kompressionsformat JPEG und unter Farbbilder wähl ich "bikubische Neuberechnung" 150 Zoll/Pixel bei bildern mit mehr als 250 Pixel/Zoll

und siehe da, das PDF wird danach in meiner Java-applikation innerhalb einer Sekunden völlig korrekt angezeigt.

Keine Ahnung, ob ihr mir mittels diesen Informationen irgendwie helfen könnt. Ich müsste es halt irgendwie schaffen, genau das gleiche, wie der Acrobat in meiner Java-anwendung machen, aber ich hab halt keine Ahnung....

Vielleicht hat ja jemand Lust von euch mitzugrübeln. Wär sehr dankbar... komm einfach nicht wirklich weiter an dem Problem....

Viele Grüße, Fabian




Leider halt nur decompilierter Code
Code:
static BufferedImage createJPEG(Dict dict, InputStream inputstream,
			PDFReader pdfreader) throws IOException {
		if (!$assertionsDisabled && (dict == null || inputstream == null))
			throw new AssertionError();
		ColorSpace colorspace = pdfreader.getColorSpace(dict.get("ColorSpace"),
				null, null);
		int i = 4;
		int i_14_ = colorspace.getNumComponents();
		if (i_14_ == 4) {
			Object object = dict.get("Length");
			byte[] is = InputStreams.toByteArray(inputstream,
					(object != null ? (long) pdfreader.getObjInt(object)
							: 10240L));
			i = JPEG.getTransform(is);
			inputstream = new ByteArrayInputStream(is);
		}
		ImageReader imagereader = (ImageReader) ImageIO
				.getImageReadersByFormatName("JPEG").next();
		ImageIO.setUseCache(false);
		ImageInputStream imageinputstream = ImageIO
				.createImageInputStream(inputstream);
		imagereader.setInput(imageinputstream, true);
		BufferedImage bufferedimage;
		try {
			if (i_14_ == 4 || colorspace instanceof ColorSpaceLab) {
				ImageReadParam imagereadparam = imagereader
						.getDefaultReadParam();
				colorspace = (12 == i ? (ColorSpace) ColorSpaceCMYK
						.getInstance() : 13 == i ? (ColorSpace) ColorSpaceYCCK
						.getInstance() : colorspace);
				Raster raster = imagereader.readRaster(0, imagereadparam);
				raster = Rasters.toRGB(raster, colorspace);
				ComponentColorModel componentcolormodel = new ComponentColorModel(
						ColorSpace.getInstance(1000), false, true, 1, 0);
				bufferedimage = new BufferedImage(componentcolormodel,
						(WritableRaster) raster, true, null);
			} else
				bufferedimage = imagereader.read(0, null);
		} catch (IOException ioexception) {
			bufferedimage = null;
			System.err.println("Couldn't read JPEG: " + ioexception);
		}
		imagereader.dispose();
		imageinputstream.close();
		return bufferedimage;
	}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben