私は、pdfのapache pdfボックスを使用してpdfで三角形を作成しようとしています。 PDShadingType4クラスを使用しています。以下はコードの実装ですが、空のpdfしか作成しませんでした。私はapacheで提供されているPDShadingType4の実装が見つかりませんでした。PDShadingType4 Apacheを使用してタイプ4のシェーディングを実装するpdf box
生成された三角形は、私がPDShadingType4を使用して、任意のシェーディングの例を見つけることができないのですapacheのPDFボックスissue
で発見され linkでPDFファイルの左下にある三角形のようになります。
実装が正しくありませんか?またはシェーディングを達成するための他の方法(三角)は彼らのであるPDShadingType4
import java.io.IOException; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSFloat; import org.apache.pdfbox.cos.COSInteger; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.function.PDFunctionType2; import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB; import org.apache.pdfbox.pdmodel.graphics.shading.PDShading; import org.apache.pdfbox.pdmodel.graphics.shading.PDShadingType4; public class TriangleGraident2 { public void create(String file) throws IOException { PDDocument document = null; try { document = new PDDocument(); PDPage page = new PDPage(); document.addPage(page); PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, false); contentStream.moveTo(38, 17); COSStream fdict = new COSStream(); fdict.setInt(COSName.FUNCTION_TYPE, 2); COSArray cosArray = new COSArray(); cosArray.add(COSInteger.get(104)); cosArray.add(COSInteger.get(83)); cosArray.add(COSInteger.get(170)); cosArray.add(COSInteger.get(17)); cosArray.add(COSInteger.get(38)); cosArray.add(COSInteger.get(17)); /*Setting color */ COSArray c0 = new COSArray(); c0.add(COSFloat.get("1")); c0.add(COSFloat.get("0")); c0.add(COSFloat.get("0")); COSArray c1 = new COSArray(); c1.add(COSFloat.get("0.5")); c1.add(COSFloat.get("1")); c1.add(COSFloat.get("0.5")); /*Setting color*/ COSArray decode = new COSArray(); decode.add(COSFloat.get("0.0")); decode.add(COSFloat.get("1.0")); decode.add(COSFloat.get("0.0")); decode.add(COSFloat.get("1.0")); decode.add(COSFloat.get("0.0")); fdict.setItem(COSName.C0, c0); fdict.setItem(COSName.C1, c1); PDFunctionType2 func = new PDFunctionType2(fdict); PDShadingType4 shading = new PDShadingType4(fdict); shading.setColorSpace(PDDeviceRGB.INSTANCE); shading.setShadingType(PDShading.SHADING_TYPE4); shading.getCOSObject().setInt(COSName.LENGTH, 32); shading.setBitsPerCoordinate(24); shading.setBitsPerComponent(16); shading.setBitsPerFlag(8); shading.getCOSObject().setItem(COSName.COORDS, cosArray); shading.setDecodeValues(decode); shading.setFunction(func); contentStream.shadingFill(shading); contentStream.close(); document.save(file); document.close(); } finally { if (document != null) { document.close(); } } } public static void main(String[] args) throws IOException { TriangleGraident2 creator = new TriangleGraident2(); creator.create("C:\\Users\\abc\\Desktop\\triangle_image.pdf"); } }
偶然、あなたがリンクしているシェーディングを作成したのは私ですが、PostScriptでそれをghostscriptでPDFに変換しました。あなたは本当にタイプ4の陰影が必要ですか?タイプ2(アキシャル)またはタイプ3(ラジアル)ではありませんか?これらの2つはPDFBoxのソースコードに例があり、タイプ4のシェーディングは難しいので、タイプ4のシェーディングはあなたが言及したような三角です。通常、3Dの錯覚を作成するには、それらのトンがあります。あなたのコードはストリームを見逃しています。 PDF仕様を参照してください。色、座標、フラグが含まれています。非常にトリッキーなもの。 –
あなたはまた、機能のものを必要としません、それは必須ではありません、あなたはそれを使用しないでよりカラフルな三角形を得ることができます。 (関数を使用している場合、三角形の各辺は1つの値になり、関数によってn個の色成分に変換され、3つの極値を得ることは困難です)。ストリームの内容は、f x y c1 ... cnです(仕様のp190を参照)。あなたが本当に必要と思っているのであればデモを実装することができます。 –
はい私はタイプ4のシェーディングが必要です。あなたが作成したリンクであなたの言葉通りにPDF仕様を読んだ後にタイプ4のシェーディングも試みました。しかし、複雑になっています。リンクやドキュメントを見つけることができませんでした三角形のあなたは上記のコードを修正してください、またはあなたが作成した三角形のコードへのリンクを提供してください。私には非常に便利です。私たちは、タイプ2(軸)またはタイプ3(放射状)シェーディング。この後、ポリゴンを描く必要があります。タイプ4シェーディングで作業していました – user3194123