質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

284閲覧

PDFを再度発行すると数字がぐちゃぐちゃになる今のスクリプト

cockpit

総合スコア1

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2024/01/28 10:40

実現したいこと

今、インボイス対応の領収書、請求書、納品書をwebで作るためのスクリプトを作っています。
細かい実装は後回しにしながらやっています。
今、困っているのが、PDFを発行すると、文字がぐちゃぐちゃになる状態を直したいのです。
canvasをコピーすればいいのかもしれないけど、その方法がわかりません。
私の目には、canvasを2つ、document.createElement("canvas")で作っているけど、実際に動いているcanvasは、1つだけみたいに見えます。
canvas2 = canvasで、コピーしているようで、コピーしきれていないのではないかと感じていますが、確実にわかっているわけではないので、確信は持てません。
直し方というか、原因がわかる方、よろしくおねがいします。
あと、ついでに、このアプリ(?)が使いやすいかどうかも教えてくれると幸いです。

発生している問題・分からないこと

文字がぐちゃぐちゃになる問題。
今、わからないのは、JavaScriptで書いている、canvasの画像のバックアップの取り方と、差し替えの仕方。
その他の細かいものは、ぐぐりながら考えます。

該当のソースコード

PHP

1ものすごく長いスクリプトなので、文字制限オーバーになるので、自分の都合がつくサーバーにうpしました。 2https://sizukasenkyo.com/apuri/tukurikake1.php

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Lodashというライブラリを使って、_.cloneDeep(canvas)のようなことをやっても無駄だったこと。
関数内で、canvas2の挙動をいちいち宣言しないとエラーになること。
JavaScriptのエラーの原因が、Python以上にわかりにくくて、死ぬほど開発しづらいということ。

補足

jsPDFというライブラリを使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2024/01/29 00:43

普通に文字化けなくダウンロードされます。 win chrome/firefox
cockpit

2024/01/29 04:37 編集

試してくれてありがとうございます。 そう。1回目のダウンロードは問題なくダウンロードされます。 問題は画像アップロードしたあとで、「1回目に打ち込んだやつ、間違えたものを打ち込んじゃったので、修正して、えい!」と、修正して出した2回目以降のPDFなんです。 もう1度画像をアップロードすれば、問題ないPDFにはなるのですが。
Lhankor_Mhy

2024/01/29 04:56 編集

再度発行というのは、具体的にはどのような手順ですか? 画面内に書かれている『テンプレ』と関係がありますか?
cockpit

2024/01/29 04:59

ありがとうございます。 テンプレートはまだ実装していません。 「背景にする画像」のとこのボタンを押して、画像を読み込ませてから、税別価格と税率を、何か設定する。そうすると、税込み価格が計算されて、税込み価格の合計が、領収価格に反映されます。 それの、税別価格をいろいろ変更して、PDFを再度発行すると、文字が前のものと重なります。 そんな症状です。
Lhankor_Mhy

2024/01/29 05:18

問題を確認しました。 ソースコードのコメントに //背景が何もなければ白紙、あれば背景をコピー。 //白く塗ると画像が消え、 //塗らないと、pdf作り直しのときに文字が前のと重なる。 //この問題をどうすべきか? とありましたが、この質問のことですか?
cockpit

2024/01/29 05:30

はい、そのとおりです。このコメントの通りです。 みつけてくれてありがとうございます。
Lhankor_Mhy

2024/01/29 06:43

「PDFをダウンロード」ボタンを押してから画像を表示するように変更するとうまくいきました。 非同期処理があるので、それを待ち合わせる必要があります。
cockpit

2024/01/29 07:36

すごく助かりました。 JavaScriptには、ほとんど慣れていなかったもので、いろんなことを不勉強なまま、見切り発車でぐぐりながらやっていたので、いろんなところでつまづいていました。ありがとうございます。
guest

回答1

0

ベストアンサー

補足依頼欄にも書きましたが、「PDFをダウンロード」ボタンを押してから画像を表示するようにするとうまくいくかと思います。
非同期処理があるので、それを待ち合わせる必要があります。以下のコードでは、async await を使いましたが、then やコールバックでももちろん大丈夫です。

js

1 function addText() { 2 //背景が何もなければ白紙、あれば背景をコピー。 3 //白く塗ると画像が消え、 4 //塗らないと、pdf作り直しのときに文字が前のと重なる。 5 //この問題をどうすべきか? 6 7 8 9 // if (file.value !== "") { 10 // canvas2 = canvas; 11 // } else { 12 // ctx.xxx = 0; 13 canvas2 = canvas; 14 // ctx2.fillStyle = '#ffffff'; 15 // ctx2.fillRect(0, 0, canvasWidth, canvasHeight); 16 // } 17 18//... 19 20 async function hakkou() { 21 await canvasDraw(); 22 addText(); 23 24//... 25 26 async function canvasDraw(imgSrc) { 27 return new Promise((resolve, reject) => { 28 29 // canvas内の要素をクリアする 30 ctx.fillStyle = `rgba(255,255,255,1)`; 31 ctx.fillRect(0, 0, canvasWidth, canvasHeight); 32 33 // ctx.clearRect(0, 0, canvasWidth, canvasHeight); 34 35 // Canvas上に画像を表示 36 var img = new Image(); 37 img.src = uploadImgSrc; 38 img.onload = function () { 39//... 40 resolve(); 41 } 42 }) 43 }

なお、背景画像がないときの処理は手抜きましたのでよろしくお願いいたします。

投稿2024/01/29 07:21

Lhankor_Mhy

総合スコア36134

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cockpit

2024/01/29 07:35

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。 超ものすごくありがとうございます。 おかげで領収書などの発行をすることができます。 あと、このスクリプトは公共のものとして、不特定多数に使わせる予定のものでもあったので、いろんな人が助かることと思います。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問