このコード(Removing Watermark from PDF iTextSharp)を使用して、同じPDFのコンテンツストリームを単純に読み込んだり書き直したりすると、コンテンツストリームに追加操作が追加されます(file)。コンテンツストリームの後のコンテンツストリームの前になぜデータがPDFコンテンツストリームに追加されますか?
q
q
/I0 Do
Q
Q
q
10 0 0 10 0 0 cm
0.1 0 0 0.1 0 0 cm
/QuickPDFXO6d1c5c37 Do
Q
q
0 -1 1 0 0 1224 cm
q
q
/I0 Do
Q
Q
q
10 0 0 10 0 0 cm
0.1 0 0 0.1 0 0 cm
/QuickPDFXO6d1c5c37 Do
Q
Q
これは私のコンテンツストリームに追加された理由を任意のアイデア?
q
0 -1 1 0 0 1224 cm
....
Q
マイコードは、私がコンテンツストリームから特定の項目を削除しようとしていることを除き、リンク先の記事に似ています。
XObjectRemover editor = new XObjectRemover();
List<List<PdfContentData>> output = editor.EditPageContent(stamper, pgNumber);
PdfContentByte content = stamper.GetUnderContent(pgNumber);
foreach (List<PdfContentData> bracketList in output)
{
foreach (PdfContentData operandList in bracketList)
{
if (operandList.operandToDelete == false)
{
int index = 0;
foreach (PdfObject op in operandList.pdfOperands)
{
op.ToPdf(content.PdfWriter, content.InternalBuffer);
content.InternalBuffer.Append(operandList.pdfOperands.Count > ++index ? (byte)' ' : (byte)'\n');
}
}
}
}
PdfContentDataクラスは、削除のフラグが設定されているすべてのコンテンツ操作のコレクションに過ぎません。
public class PdfContentData
{
public int opNumber { get; set; }
public PdfLiteral pdfOperator { get; set; }
public List<PdfObject> pdfOperands { get; set; }
public bool operandToDelete { get; set; }
public PdfContentData(int opNum, PdfLiteral op, List<PdfObject> ops)
{
this.opNumber = opNum;
this.pdfOperator = op;
this.pdfOperands = ops;
}
public override string ToString()
{
return $"Ops: [{string.Join(",", pdfOperands.Select(p => p.ToString()).ToArray())}] Del: [{operandToDelete}]";
}
}
とXObjectRemoverは、@ MKLの例ではちょうどTransparentGraphicsRemoverのように、PdfContentStreamEditorから派生しているだけのクラスです。
完全に動作します。ありがとう@mkl! – Darren