2017-12-13 1 views
1

Eine Anwendung, an der ich programmatisch arbeite, generiert eine PDF. Ich wurde gebeten, die Fähigkeit hinzuzufügen, den Farbraum der Bilder einzustellen, die alle gleich sein sollten. Derzeit erzeugt mein Code den Farb als die folgenden:Wie definiere ich einen Farbraum und setze ihn auf Bilder in einer PDF?

3 0 obj 
<< 
/N 3 
/Alternate /DeviceRGB 
/Length 284 
/Filter [/FlateDecode] 
>> 
stream 
8c``2ptqre``ÈÍ+) 
rwRˆˆŒR`¿ÀÀÁÀÍ Ì`Ì`˜\\ààà yùy© |»ÆÀ¢/ë‚Ì”Ǹ’ŠJ€ô 6JI-Nf``4 ²³ËK 
€âŒs€l‘¤l0{ˆ]äd²ùÒ!ì+ v„ýÄ.zÈþRŸf3q€Í°[email protected]ì’Ô 
½Îù•E™é% 
F 
Ž)ùI© 
Á•Å%©¹Å 
žyÉùEùE‰%©)@µ÷ D!(Ä4---4Iô7A Šës 8|ÅÎ Ä ¹´¨Êdd2&ÌG˜1G‚Á)Ë„˜I/Ãþ©15C}†}s ïPo 
endstream 
endobj 
4 0 obj 
[/ICCBased 3 0 R] 
endobj 

Dies funktioniert, in und dass die PDF geladen werden. Allerdings, wenn ich versuchen, diese Farbraum auf ein Bild zu setzen, wie die folgenden:

23 0 obj 
<< 
/Type /XObject 
/Subtype /Image 
/Name /I5 
/Length 2995953 
/Width 3675 
/Height 3675 
/Filter /DCTDecode 
/ColorSpace 4 0 R 
/BitsPerComponent 8 
>> 
stream 

Bilddaten nicht hier der Kürze halber

endstream 
endobj 

Dieses auf das Scannen ein anderes PDF gültig basiert sieht mit ein Bild. Wenn ich nicht versuche, den Farbraum zu ersetzen, sondern stattdessen "/ Colorspace/DeviceRGB", wird die PDF-Datei ordnungsgemäß geladen.

Ich weiß, dass ich hier etwas Wichtiges vermisse, aber ich kann nicht herausfinden, was.

ICC profile being used

Bad PDF

+0

Sind Sie sicher, spezielle ASCII-Zeichen zu verwenden, die eindeutig reine Binärdaten sein sollten? Oder ist dies nur eine simulierte Ansicht und die tatsächlichen Daten * ist * die richtige binäre Form eines komprimierten Farbraums? – usr2564301

+1

Die tatsächlichen Daten sind in der Tat der komprimierte Farbraum. Wenn es die Dinge weniger verwirrend machen würde, kann ich das durch eine Notiz ersetzen, dass dort Daten nicht gezeigt werden, wie ich mit den Bilddaten gemacht habe. –

+0

Sind Sie mit den Daten in den Daten des ICC-Datenstroms vertraut?(korrekt gelesen, codiert und die Quelle ICC ist vom Typ RGB) – dwarring

Antwort

2

Das Problem war mit dem Querverweis-Index, der den Eintrag für 4 0 R das [/ICCBased 3 0 R] Objekt fehlte.

Ich bemerkte das Problem beim Öffnen der PDF mit xpdf, die den Fehler ergab: Internal Error: xref num 25 not found but needed, try to reconstruct.

Von dort aus überprüfte ich die Querverweistabelle manuell gegen die tatsächlichen Objekte mit einem Texteditor, um das fehlende Objekt zu finden.

Das xref-Tabelle benötigt ein paar kleine Änderungen wie folgt:

xref 0 26 %% <-- was 0 25 0000000000 65535 f 0000000009 00000 n 0000000201 00000 n 0000000253 00000 n 0000000638 00000 n %% <-- added this line 0000000671 00000 n 0000000764 00000 n 0000000928 00000 n 0000001031 00000 n 0000001195 00000 n 0000001298 00000 n 0000001464 00000 n 0000001568 00000 n 0000001734 00000 n 0000001838 00000 n 0000002004 00000 n 0000002108 00000 n 0000002274 00000 n 0000002378 00000 n 0008538650 00000 n 0012148952 00000 n 0020386142 00000 n 0025352962 00000 n 0027568145 00000 n 0030564286 00000 n 0030564334 00000 n trailer

PDF dann geöffnet und normal angezeigt, xpdf verwenden.

0

Nehmen wir an, Sie über ein gültiges Bild XObject in PDF, die derzeit in einem bestimmten Color dargestellt wird, z.B. GerätCMYK. Wenn Sie dieses Bild ändern möchten, um einen anderen ColorSpace zu verwenden, z. DeviceRGB (Ich werde den Grund dafür, warum Sie das tun) beiseite legen, normalerweise müssen Sie die Bilddaten von einem zum anderen umwandeln.

Andernfalls, wenn Sie nur den referenzierten Farbraum ändern, riskieren Sie, dass das Bild nicht so angezeigt wird, wie Sie es erwarten würden (z. B. invertiert oder Farben durcheinander). Es ist möglich, dass Sie einen Fall haben, in dem die Bilddaten nicht verändert erscheinen, aber dies wird ein sehr fragiler Ansatz sein, wenn Sie die Bilddaten nicht wirklich ändern.

Sie können eine hilfreichere Antwort erhalten, wenn Sie angeben, welche API Sie zum Beispiel verwenden, um mit dem PDF zu arbeiten.

+0

Das Bild wurde bereits im richtigen Farbraum ausgegeben. Wir möchten diesen Farbraum nur in der PDF-Datei speichern, damit der Drucker das Endprodukt optimieren kann. Was die API betrifft, ist es eine selbstgemachte, die nur die Tags ausgibt. –

Verwandte Themen