c# - 如何使用 itextsharp 将彩色 pdf 或图像转换为黑白或灰度 pdf?
问题描述
当我尝试在 C# WinForm 应用程序中将彩色 pdf 或图像转换为黑白或灰度 pdf iTextSharp时,它不起作用,它也有透明图像的问题。转换时,它会将背景变为黑色以获得透明图像。我首先使用以下代码转换为pdf
string urlpdf = output.Replace(".png", ".pdf").Replace(".jpeg", ".pdf").Replace(".jpg", ".pdf").Replace(".PNG", ".pdf").Replace(".JPEG", ".pdf").Replace(".JPG", ".pdf");
using (FileStream fs = File.Open(urlpdf, FileMode.OpenOrCreate))
{
PdfWriter PdfIns = PdfWriter.GetInstance(docPNG, fs);
docPNG.Open();
iTextSharp.text.Image pdfImage = iTextSharp.text.Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Jpeg);
if (comboBox8.SelectedIndex == 1)
{
pdfImage.ScaleToFit(rec);
pdfImage.SetAbsolutePosition((docPNG.PageSize.Width - pdfImage.ScaledWidth) / 2, (docPNG.PageSize.Height - pdfImage.ScaledHeight) / 2);
}
else
{
pdfImage.ScalePercent((float)numericUpDown4.Value);
}
docPNG.Add(pdfImage);
docPNG.CloseDocument();
docPNG.Close();
}
然后到灰度或黑白如下 -
iTextSharp.text.pdf.converter.PdfContentToGrayscaleConverter grayscaleConverter = new iTextSharp.text.pdf.converter.PdfContentToGrayscaleConverter();
using (PdfReader reader = new PdfReader(inputFile))
{
using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
iTextSharp.text.Document document = new iTextSharp.text.Document(reader.GetPageSizeWithRotation(1));
PdfWriter writer = PdfWriter.GetInstance(document, fsOutput);
document.Open();
PdfContentByte cb = writer.DirectContent;
int numberOfPages = reader.NumberOfPages;
try
{
for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++)
{
iTextSharp.text.Rectangle pageSizeWithRotation = reader.GetPageSizeWithRotation(pageNumber);
document.SetPageSize(pageSizeWithRotation);
document.NewPage();
int SecondChance = 0;
conti: ///continue again
try
{
// >>> CONVERT CURRENT PAGE TO GRAYSCALE
grayscaleConverter.Convert(reader, pageNumber);
// <<<<
}
catch
{
if (SecondChance == 0)
{
SecondChance++;
goto conti; ///junmp to conti
}
}
PdfImportedPage pip = writer.GetImportedPage(reader, pageNumber);
if (pageSizeWithRotation.Rotation == 90 || pageSizeWithRotation.Rotation == 270)
{
cb.AddTemplate(pip, 0, -1f, 1f, 0, 0, pageSizeWithRotation.Height);
}
else
{
cb.AddTemplate(pip, 1f, 0, 0, 1f, 0, 0);
}
}
}
catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
cb.PdfDocument.Close();
document.Close(); document.Dispose(); document = null;
writer.Close(); writer.Dispose(); writer = null;
reader.Close(); reader.Dispose();
}
}
解决方案
推荐阅读
- python - 错误:`pyodbc.drivers()` 在 VSCode 中返回空列表
- reactjs - 测试时如何触发功能组件的卸载?
- dockerfile - 如何使用 Docker 配置 SAP SNC
- android - 等待 Firebase Auth 完成,然后将数据加载到片段
- pandas - 带有烧瓶的熊猫为搜索数组获取 Nonetype
- c# - 将视图模型发送到局部视图时,为什么会出现类型错误 (InvalidOperationException)?
- go - 杜松子酒如何检查参数是否已发布
- java - Gradle 不解析从父 pom 继承的传递依赖
- python - 如何转义单引号或以其他方式达到最终结果?
- python - 有没有办法使用 python 的 rdflib 模块将 SPARQL 查询解析树反向转换为查询字符串?