ASP.NET(Framework 3.5)とCrystal Reportsを使用して大学生のIDカードをPDFファイルで生成していますが、カードを透明なシートに印刷して、同じサイズのプラスチックカードに貼り付けたいのですが、印刷されるすべてのものがミラーリングされます。クリスタルレポート自体をミラーリングした形でデザインしようとしましたが、ミラーリングされた形でテキストを書く方法が見つかりませんでした。誰かがこの作業を行う方法を提案できますか?私が望むのは、PDFファイルまたはCrystalReportの内容を反転することだけです。
2 に答える
いくつかのアイデア:
1)PDFを画像にレンダリングします(Ghostscript / ImageMagickまたは商用PDFライブラリ(Tifなど)を使用して、印刷用に画像をミラーリングします)
2)PDF自体をミラーリングします。iTextSharpで可能かもしれません
3)レポートツールを使用して、ある種のリバースフォントを試してみてください(簡単なオプションです)
ページをインポートして PDF コンテンツ ストリームに直接書き込むことができる API であれば、これを行うことができます。
iText (Java) では、次のようになります。
PdfReader reader = new PdfReader(pdfPath);
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance( doc, new FileOutputStream(outPath) );
for (int pageNum = 1; pageNum <= reader.getNumberOfPages(); ++pageNum) {
PdfImportedPage page = writer.getImportedPage(reader, pageNum);
PdfContentByte pageContent = writer.getDirectContent();
// flip around vertical axis
pageContent.addTemplate(page, 1f, 0f, 0f, -1f, page.getWidth(), 0f);
doc.newPage();
}
上記のコードは、次の ass-u-me-options を作成しています。
- デフォルトの
Document()ページ サイズは、現在の のサイズと一致しますPdfImportedPage。 - ソース ページは回転しません。
- 注釈、オプションのコンテンツ グループ (レイヤー)、およびページ コンテンツに表示されないその他のさまざまな部分はありません。
いくつかの回避策:
// keep the page size consistent
PdfImportedPage page = writer.getImportedPage(reader, pageNum);
doc.newPage(page.getBoundingBox());
PdfContentByte pageContent = writer.getDirectContent();
pageContent.addTemplate(...);
// to compensate for a page's rotation, you need to either rotate the target page
// Easy in PdfStamper, virtually impossible with `Document` / `PdfWriter`.
AffineTransform unRotate = AffineTranform.getRotateInstance(degToRad(360 - pageRotation), pageCenterX, pageCenterY)
AffineTransform flip = new AffineTransform(1f, 0f, 0f, -1f, page.getWidth(), 0f);
AffineTransform finalTrans = flip;
finalTrans.concatenate(unRotate);
pageContent.addTemplate(page, finalTrans);
公正な警告: 私の 2 次元行列法はそれほど強力ではありません。私はほぼ間違いなく何か間違ったことをしています。この種のものをデバッグすることは、本当の PITA です。ものは「正しく見える」か、ページから完全に外れてひどく台無しになっています(つまり、見えないので、どちらに行ったのかわかりません)。ページの四角形を [-1000 -1000 1000 1000] ずつ変更することがよくあります。楽しいもの。
注釈のコピーなどについては... 痛い。PdfCopy はそのaddPage()メソッドを介してすべてのことを行いますが、最初にページ コンテンツを変換することはできません。PdfImportedPage に加えた変更は無視されます。あなたは本当にハードウェイに行き詰まっています...すべての厄介なビットを手動でコピーし、それらを変更してめくったページを補う...またはソースをいじって、addPage()必要な結果を取得します。どちらも PDF に関する深い知識が必要です。
詳細を考えると、おそらく心配する必要はありませんが、別の状況の人が同じ目標を達成した場合に備えて、言及する価値があります.