2017-11-02 18 views
-2

私の目標は、既存のpdf(ウォーターマークではない)のすべてのページに会社のロゴを追加することです。c#.NET CORE ITextSharpを使用して既存のPDFに透明性のあるイメージを追加する

pdfファイルとロゴの特性上、私はPDFコンテンツの上部にのみロゴを置くことができます(下側ではありません)。ロゴは透明性をサポートしている必要があります。

もう1つの制限は.NETコアを使用することです。

私は明確な解決策を見つけることができなかったので、これを回答と一緒に投稿してください。 提案/修正/改善を歓迎します。

誰かがこれを見つけることを希望します。

+2

iText 7は.NET Coreをサポートしています。私は古いiTextSharpではなく、.NET Core用のiText 7を使用することをお勧めします。 –

+0

iText7は、AGPLの条件または購入のいずれかで使用することができますが、どちらも私の状況では使用できません。しかし、それを指摘してくれてありがとう、私は自分の答えを変更します – XpyM

+0

商用コンテキストでiTextを使いたいのでAGPLバージョンを使用できない場合は、現在使用しているバージョンを使用することはできません。 [Can iText 2.1.7/iTextSharp 4.1.6以前は市販されていますか?](https://developers.itextpdf.com/question/versions-older-than-5) –

答えて

-2

.NETコアをサポートする最新のiTextSharpライブラリはですが、私はそれを正当に使用することはできません。私のコードをオープンソースにすることも、ライセンスを購入することも私の選択肢ではありません。したがって、私は昔、サードパーティのライブラリを使用します。

Install-Package iTextSharp.LGPLv2.Core 

最新版、私が使用しているものを、この記事の時点で1.3.2

後usingsは

using System; 
using System.Drawing.Imaging; 
using System.IO; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 
を必要としていますさ

pdfで画像の透明度を高めるには、画像を正しい形式で開く必要があります。

var preImage = System.Drawing.Image.FromFile(imagePath); 
var image = Image.GetInstance(preImage, ImageFormat.Png); 

画像INGの、ここで

canvas.AddImage(image);//do not put .AddImage(image, true); 

var imagePath = "logo.png"; 
var pdfPath = "edit_this.pdf"; 

//load pdf file 
var pdfBytes = File.ReadAllBytes(pdfPath); 
var oldFile = new PdfReader(pdfBytes); 

//load image 
var preImage = System.Drawing.Image.FromFile(imagePath); 
var image = Image.GetInstance(preImage, ImageFormat.Png); 
preImage.Dispose(); 

//optional: if image is wider than the page, scale down the image to fit the page 
var sizeWithRotation = oldFile.GetPageSizeWithRotation(1); 
if (image.Width > sizeWithRotation.Width) 
    image.ScalePercent(sizeWithRotation.Width/image.Width * 100); 

//set image position in top left corner 
//in pdf files, cooridinates start in the left bottom corner 
image.SetAbsolutePosition(0, sizeWithRotation.Height - image.ScaledHeight); 

//in production, I use MemoryStream 
//I put FileStream here to test the code in console application 
using (var newFileStream = new FileStream("with_logo.pdf", FileMode.Create)) 
{ 
    //setup PdfStamper 
    var stamper = new PdfStamper(oldFile, newFileStream); 

    //iterate through the pages in the original file 
    for (var i = 1; i <= oldFile.NumberOfPages; i++) 
    { 
     //get canvas for current page 
     var canvas = stamper.GetOverContent(i); 
     //add image with pre-set position and size 
     canvas.AddImage(image); 
    } 

    stamper.Close(); 
} 

このコードは、ローカルファイルで動作するすべてのコードにあるインラインする画像を選択しないことも重要です。 私の(現実の)ケースでは、Base64文字列としてpdfファイルを受け取り、ローカルストレージからロゴを追加し、Base64文字列に変換してWebページに出力します。

ロゴに含まれる拡張子を制御するため、イメージを強制的にPNG形式で開きます(ハードコードされています)。必要に応じてダイナミックに画像フォーマットを設定することができます。

+0

「iTextSharp.LGPLv2.Core」を公開して9年の公式のiTextバージョンに "最新の"バージョンを載せている人々の、なんて暗い考えです。なぜ彼らはC#を作成することを選択しなかったのだろうか。[iText 7デベロッパープラットフォーム](https://itextpdf.com/itext-developer-platform)のNETコアバージョン。そうすれば、彼らはiText Groupの支援を受けることになります。今は彼ら自身で、iText Groupに蓄積されたPDFノウハウの恩恵を受けることはできません。 –

+0

iTextの最新の.NET Coreバージョンは、iText 7.0.5です:https://www.nuget.org/packages/itext7/7.0.5(あなたの答えではiTextSharp.LGPLv2.Core 1.3.2ではありません)。 –

+0

お寄せいただきありがとうございます。 PdfStamperの使用方法を変更しました。コードが少なく、読みやすい。かなり甘い:) – XpyM

関連する問題